資料結構 筆記:二叉樹中的結點刪除與清除
阿新 • • 發佈:2018-11-29
刪除的方式
-基於資料元素值的刪除
·SharedPointer<Tree<T>>remove(const T& value)
-基於結點的刪除
·SharedPointer<Tree <T>>remove(TreeNode<T>* node)
刪除操作功能的定義
-void remove(BTreeNode<T>* node,BTree<T>* &ret)
·將node為根結點的子樹從原來的二叉樹中刪除
·ret作為子樹返回(ret指向堆空間中的二叉樹物件)
刪除功能函式的實現
virtual void remove(BTreeNode<T>* node,BTree<T>* &ret) { ret = new BTree<T>(); if(ret == NULL) { //丟擲異常 } else { if(root() == node) { this->m_root = NULL; } else { BTreeNode<T>* parent = dynamic_cast<BTreeNode<T>*>(node->parent); if( parent->left == node) { parent->left = NULL; } else if(parent->right == node) { parent->right = NULL; } node->parent = NULL; } ret->m_root = node; } }
清楚操作的定義
-void clear()
·將二叉樹中的所有結點清除(釋放堆中的結點)
清除操作功能的定義
-free(node)
·清除node為根結點的二叉樹
·釋放二叉樹中的每一個結點
virtual void free(BTreeNode<T>* node) { if(node != NULL) { free(node->left); free(node->right); cout << node->value << endl; if(node->flag()) { delete node; } } }
總結:
-刪除操作將目標結點所代表的子樹移除
-刪除操作必須完善處理父結點和子結點的關係
-清除操作作用於銷燬樹中的每個結點
-銷燬結點時判斷是否釋放對應的記憶體空間(工廠模式)