C++数据结构第64课、二叉树中的结点删除与清除

  • 删除的方式
    — 基于数据元素值的删除:SharedPointer< Tree<T> > remove(const T& value)
    — 基于结点的删除:SharedPointer< Tree<T> > remove(TreeNode<T>* node)
  • 二叉树中结点的删除
    在这里插入图片描述
  • 删除操作功能的定义
    virtual void remove(BTreeNode<T>* node, BTree<T>*& ret)
    1、将 node 为根结点的子树从原来的二叉树中删除,
    2、ret 作为子树返回(ret 指向堆空间中的二叉树对象)
    在这里插入图片描述
  • 清除操作的定义:void clear()
    — 将二叉树中的所有结点清除(释放堆中的结点)
    在这里插入图片描述

free(node)
— 清除 node 为根结点的二叉树
— 释放二叉树中的每一个结点

在这里插入图片描述

BTree.h

protected:
    virtual void remove(BTreeNode<T>* node, BTree<T>*& ret)
    {
        ret = new BTree<T>();

        if( ret == NULL )
        {
            THROW_EXCEPTION(NoEnoughMemoryException, "No memroy to create new tree ...");
        }
        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;
        }
    }

    virtual void free(BTreeNode<T>* node)
    {
            if( node != NULL )
            {
                free(node->left);
                free(node->right);

                if( node->flag() )
                {
                    delete node;
                }
            }
    }
    
public:
    SharedPointer< Tree<T> > remove(const T& value) //删除的节点的子节点我们还需要处理,因此要返回删除节点的指针,//这样有机会对里面的元素做进一步操作
    {
        BTree<T>* ret = NULL;
        BTreeNode<T>* node = find(value);

        if( node == NULL )
        {
            THROW_EXCEPTION(InvalidParameterException, "Can not find the tree node via value ...");
        }
        else
        {
            remove(node, ret);
        }

        return ret;
    }

    SharedPointer< Tree<T> > remove(TreeNode<T>* node)
    {
        BTree<T>* ret = NULL;

        node = find(node);

        if( node == NULL )
        {
            THROW_EXCEPTION(InvalidParameterException, "Parament node is invalid ...");
        }
        else
        {
            remove(dynamic_cast<BTreeNode<T>*>(node), ret);
        }

        return ret;
    }

    void clear()
    {
        free(root());
        this->m_root = nullptr;
    }

main.cpp

#include <iostream>
#include "BTree.h"

using namespace std;
using namespace XiebsLib;


int main()
{
    BTree<int> bt;
    BTreeNode<int>* n = nullptr;

    bt.insert(1, nullptr);

    n = bt.find(1);
    bt.insert(2, n);
    bt.insert(3, n);

    n = bt.find(2);
    bt.insert(4, n);
    bt.insert(5, n);

    n = bt.find(4);
    bt.insert(8, n);
    bt.insert(9, n);

    n = bt.find(5);
    bt.insert(10, n);

    n = bt.find(3);
    bt.insert(6, n);
    bt.insert(7, n);

    n = bt.find(6);
    bt.insert(11, n, LEFT);

    bt.remove(3);
    int a[] = {8, 9, 10, 11, 7};

    for(int i = 0; i < 5; i++)
    {
        TreeNode<int>* node = bt.find(a[i]);

        while( node )
        {
            cout << node->value << " ";
            node = node->parent;
        }

        cout << endl;
    }

    return 0;
}

在这里插入图片描述

  • 小结
    1、删除操作将目标结点所代表的子树移除
    2、删除操作必须完善处理父结点和子结点的关系
    3、清除操作作用于销毁树中的每个结点
    4、销毁结点时判断是否释放对应的内存空间(工厂模式)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值