樹——二叉樹結點的刪除與清除


1,刪除的方式:

       1,基於數據元素值的刪除:

              1,SharedPointer< Tree<T> > remove(const T& value)

                     1,刪除的是那個以結點為根結點的子樹,所以返回值是一個指向樹的指針;

                     2,希望智能指針幫助管理這個堆空間創建出來的樹;

       2,基於結點的刪除:

              1,SharedPointer< Tree<T> > remove(TreeNode<T>* node)

             

2,二叉樹中結點的刪除:

      

3,刪除操作功能的定義及實現:

 

       1,void remove(BTreeNode<T>* node, BTree<T>*& ret)

              1,將 node 為根結點的子樹從原來的二叉樹中刪除;

              2,ret 作為子樹返回(ret 指向堆空間中的二叉樹樹對象);

  2,功能函數代碼實現:

 1    /* 實現一個刪除功能函數, ret 返回一個堆空間中的二叉樹對象 */
 2     virtual void remove(BTreeNode<T>* node, BTree<T>*& ret)
 3     {
 4         ret = new BTree<T>();
 5 
 6         if( ret == NULL )
 7         {
 8             THROW_EXCEPTION(NoEnoughMemoryException, "No memory to create new tree ...");
 9         }
10         else  // node 當然是不可以為空,在共有 remove() 函數中有體現,但是這樣不好,建議在此處體現的好
11         {
12             if( root() == node )  // 如果刪除的是根結點
13             {
14                 this->m_root = NULL;  // 根結點清空,這里有點不理解,這里 m_root 只是樹指向 node 的一個指針,它不是結點的一部分;
15             }
16             else  // 斷掉和父結點之間的指針
17             {
18                BTreeNode<T>* parent = dynamic_cast<BTreeNode<T>*>(node->parent);
19 
20                 if( parent->left == node )  // 如果結點是父結點的左子樹
21                 {
22                     parent->left = NULL;
23                 }
24                 else if( parent->right == node )  // 如果結點是父結點的右子樹
25                 {
26                     parent->right = NULL;
27                 }
28 
29                 node->parent = NULL;  // 刪除結點的父親
30             }
31 
32             ret->m_root = node;  // 通過 ret 返回新的結點指向這里
33         }
34    }

  3,成員函數代碼實現:

    1,基於數據值的代碼實現:

 1    SharedPointer< Tree<T> > remove(const T& value)
 2     {
 3         BTree<T>* ret = NULL;
 4 
 5         BTreeNode<T>* node = find(value);
 6 
 7         if( node == NULL )
 8         {
 9             THROW_EXCEPTION(InvalidParameterException, "Can not find the tree node via value ...");
10         }
11         else
12         {
13             remove(node, ret);
14 
15             m_queue.clear();
16         }
17 
18         return ret;
19    }

      2,基於結點的代碼實現:

 1    SharedPointer< Tree<T> > remove(TreeNode<T>* node)
 2     {
 3         BTree<T>* ret = NULL;
 4 
 5         node = find(node);  // 當前要刪除的結點在這個樹中
 6 
 7         if( node == NULL )
 8         {
 9             THROW_EXCEPTION(InvalidParameterException, "Parameter node is invalid ...");
10         }
11         else
12         {
13             remove(dynamic_cast<BTreeNode<T>*>(node), ret);
14 
15             m_queue.clear();
16         }
17 
18         return ret;
19     }

 

4,清除操作的定義:

       1,void clear()

              1,將二叉樹中的所有結點清除(釋放堆中的結點);

             

5,二叉樹中結點的清除:

 

 

6,清除操作功能的定義及成員函數實現:

      

       1,free(node):

              1,清除 node 為根結點的二叉樹;

              2,釋放二叉樹中的每一個結點;

  2,功能函數代碼實現:

 1    /* 定義清除功能函數,參數為要清除樹的根結點 */
 2     virtual void free(BTreeNode<T>* node)
 3     {
 4         if( node != NULL )  // 樹非空
 5         {
 6             free(node->left);
 7             free(node->right);
 8 
 9             if( node->flag() )  // 如果是從堆空間申請來的
10             {
11                 delete node;
12             }
13         }
14     }

  3,clear() 成員函數代碼實現:

1     void clear()
2     {
3         free(root());
4         m_queue.clear();
5         this->m_root = NULL;
6     }

 

7,小結:

       1,刪除操作將目標結點所代表的子樹移除;

       2,刪除操作必須完善處理父結點和子結點的關系;

              1,完全斷絕父子關系;

       3,清除操作用於銷毀樹中的每個結點;

       4,銷毀結點時判斷是否釋放對應的內存空間(工廠模式);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM