1. 程式人生 > >資料結構 筆記:二叉樹中的結點刪除與清除

資料結構 筆記:二叉樹中的結點刪除與清除

刪除的方式

-基於資料元素值的刪除

·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;
            }
        }
    }

總結:

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

-刪除操作必須完善處理父結點和子結點的關係

-清除操作作用於銷燬樹中的每個結點

-銷燬結點時判斷是否釋放對應的記憶體空間(工廠模式)