第64课 - 二叉树中的结点删除与清除

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指向堆空间中的二叉树对象)



        删除功能函数的实现

                                


2、编程实验 

二叉树结点的删除操作

BTree.h

protected新增

  1. virtual void remove(BTreeNode<T>* node,BTree<T>*& ret)  
  2.     {  
  3.         ret = new BTree<T>();  
  4.   
  5.         if(ret == NULL)  
  6.         {  
  7.             THROW_EXCEPTION(NoEnoughMemoryException,"No memory to create new tree ...");  
  8.         }  
  9.         else  
  10.         {  
  11.             if(root() == node)  
  12.             {  
  13.                 this->m_root = NULL;  
  14.             }  
  15.             else    //断绝父子关系  
  16.             {  
  17.                 BTreeNode<T>* parent = dynamic_cast<BTreeNode<T>*>(node->parent);  
  18.   
  19.                 if(parent->left == node)  
  20.                 {  
  21.                     parent->left = NULL;  
  22.                 }  
  23.                 else if(parent->right == node)  
  24.                 {  
  25.                     parent->right = NULL;  
  26.                 }  
  27.   
  28.                 node->parent = NULL;  
  29.             }  
  30.         }  
  31.   
  32.         ret->m_root = node;  
  33.     }  

public

  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.   
  16.     return ret;  
  17. }  
  18.   
  19. SharedPointer< Tree<T> > remove(TreeNode<T>* node)  
  20. {  
  21.     BTree<T>* ret = NULL;  
  22.   
  23.     node = find(node);  
  24.   
  25.     if(node == NULL)  
  26.     {  
  27.         THROW_EXCEPTION(InvalidParameterException,"Parameter node is invalid ...");  
  28.     }  
  29.     else  
  30.     {  
  31.         remove(dynamic_cast<BTreeNode<T>*>(node),ret);  
  32.     }  
  33.   
  34.     return ret;  
  35. }  

main.cpp

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

using namespace std;
using namespace DTLib;


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

    bt.insert(1,NULL);

    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);

    int a[] = {8,9,10,11,7};

    SharedPointer< Tree<int> > sp = bt.remove(3);

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

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

        cout<<endl;

    }

    return 0;
}

                        


3、二叉树中的结点清除

        清除操作的定义

                 - void clear() 

                             将二叉树中的所有结点清除释放堆中的结点


        二叉树中结点的清除 

            

                                                                递归的操作

      

        清除操作功能的定义 

                - free(node

                        清除node为根结点的二叉树 

                        释放二叉树中的每一个结点 

            


4、编程实验 

清除二叉树中的结点

protected新增

  1. virtual void free(BTreeNode<T>* node)  
  2. {  
  3.     if(node != NULL)  
  4.     {  
  5.         free(node->left);  
  6.         free(node->right);  
  7.   
  8.         if(node->flag())  
  9.         {  
  10.             delete node;  
  11.         }  
  12.     }  
  13. }  

public

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



5、小结 

            制除操作将目标结点所代表的子树移除 

            删除操作必须完善处理父结点和子结点的关系 

            清除操作用于销毁树中的每个结点 

            销毁结点时判断是否释放对应的内存空间( 工厂模式) 


6、实战预告 

        To be continued… 

        思考: 

                如何实现BTree (二叉树结构)的属性操作函数



猜你喜欢

转载自blog.csdn.net/qq_39654127/article/details/80501666