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,銷毀結點時判斷是否釋放對應的內存空間(工廠模式);