第68课 - 二叉树的比较与相加

1、二叉树的克隆操作 

            - SharedPointer< BTree<T> > clone() const 

                    克隆当前树的一份拷贝 

                    返回值为堆空间中的一棵新二叉树(与当前树相等)


        二叉树的克隆 

             - 定义功能: clone(node

                    拷贝node为根结点的二叉树数据元素在对应位置相等

        

                                                         递归的思想


2、编程实验 

二叉树的克隆 clone() 

BTree.h

新增

public

  1. SharedPointer< BTree<T> > clone() const  
  2. {  
  3.     BTree<T>* ret = new BTree<T>();  
  4.   
  5.     if(ret != NULL)  
  6.     {  
  7.         ret->m_root = clone(root());  
  8.     }  
  9.     else  
  10.     {  
  11.         THROW_EXCEPTION(NoEnoughMemoryException,"No memory to create new tree ...");  
  12.     }  
  13.   
  14.     return ret;  
  15. }  

protected

  1. BTreeNode<T>* clone(BTreeNode<T>* node)  const  
  2. {  
  3.     BTreeNode<T>* ret = NULL;  
  4.   
  5.     if(node != NULL)  
  6.     {  
  7.         ret = BTreeNode<T>::NewNode();  
  8.   
  9.         if(ret != NULL)  
  10.         {  
  11.             ret->value = node->value;  
  12.   
  13.             ret->left = clone(node->left);  
  14.             ret->right = clone(node->right);  
  15.   
  16.             if(ret->left != NULL)  
  17.             {  
  18.                 ret->left->parent = ret;  
  19.             }  
  20.   
  21.             if(ret->right != NULL)  
  22.             {  
  23.                 ret->right->parent = ret;  
  24.             }  
  25.         }  
  26.         else  
  27.         {  
  28.             THROW_EXCEPTION(NoEnoughMemoryException,"No memory to create new node ...");  
  29.         }  
  30.     }  
  31.   
  32.     return ret;  
  33. }  

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


    SharedPointer< BTree<int> > sp = bt.clone();


    cout<<"Clone : "<<endl;

    for((*sp).begin();!(*sp).end();(*sp).next())
    {
        cout<<(*sp).current()<<" ";
    }

    cout<<endl<<endl;

    cout<<"Old BTree: "<<endl;

    for(bt.begin();!bt.end();bt.next())
    {
        cout<<bt.current()<<" ";
    }

    cout<<endl<<endl;

    return 0;
}

                        



3、二叉树比较操作的定义 

        -判断两棵二叉树中的数据元素是否对应相等 

                bool operator == (const BTree<T>& btree

                bool operator ! = (const BTree<T>& btree

        


        二叉树的比较

             - 定义功能: equallh ,  rh 

                    判断lh为根结点的二叉树与rh为根结点的二叉树是否相等

            

                                                        递归的思想



4、编程实验 

二叉树的相等比较     equal() 

BTree.h

public

新增

  1. bool operator == (BTree<T>& btree)  
  2. {  
  3.     return equal(root(),btree.root());  
  4. }  
  5.   
  6. bool operator != (BTree<T>& btree)  
  7. {  
  8.     return !(*this == btree);  
  9. }  

protected

新增

  1. bool equal(BTreeNode<T>* lh,BTreeNode<T>* rh)  
  2. {  
  3.     if(lh == rh)  
  4.     {  
  5.         return true;  
  6.     }  
  7.     else if((lh != NULL) && (rh != NULL))  
  8.     {  
  9.         return (lh->value == rh->value) && (equal(lh->left,rh->left)) && (equal(lh->right,rh->right));  
  10.     }  
  11.     else  
  12.     {  
  13.         return false;  
  14.     }  
  15. }  

main.cpp

    cout<<"*sp == bt : "<<(*sp == bt)<<endl;


                    


5、二叉树的相加操作 

            SharedPointer< BTree<T> > addconst BTree<T> & btree) const 

                    将当前二叉树与参数btree中的数据元素在对应位置处相加 

                    返回值(相加的结果)为堆空间中的一棵新二叉树 




         二叉树的加法 

             - 定义功能: add(lh, rh

                    lh为根结点的二叉树与rh为根结点的二叉树相加 

            

                                                            递归的思想


6、编程实验 

二叉树的相加     add() 

BTree.h

public

新增

  1. SharedPointer< BTree<T> > add(const BTree<T>& btree) const  
  2. {  
  3.     BTree<T>* ret = new BTree<T>();  
  4.   
  5.     if(ret != NULL)  
  6.     {  
  7.         ret->m_root = add(root(),btree.root());  
  8.     }  
  9.     else  
  10.     {  
  11.         THROW_EXCEPTION(NoEnoughMemoryException,"No memory to create new tree ...");  
  12.     }  
  13.   
  14.     return ret;  
  15. }  

protected

新增

  1. BTreeNode<T>* add(BTreeNode<T>* lh,BTreeNode<T>* rh) const  
  2. {  
  3.     BTreeNode<T>* ret = NULL;  
  4.   
  5.     if((lh == NULL)&&(rh != NULL))  
  6.     {  
  7.         ret = clone(rh);  
  8.     }  
  9.     else if((lh != NULL)&&(rh == NULL))  
  10.     {  
  11.         ret = clone(lh);  
  12.     }  
  13.     else if((lh != NULL)&&(rh != NULL))  
  14.     {  
  15.         ret = BTreeNode<T>::NewNode();  
  16.   
  17.         if(ret != NULL)  
  18.         {  
  19.             ret->value = lh->value + rh->value;  
  20.   
  21.             ret->left = add(lh->left,rh->left);  
  22.             ret->right = add(lh->right,rh->right);  
  23.   
  24.             if(ret->left != NULL)  
  25.             {  
  26.                 ret->left->parent = ret;  
  27.             }  
  28.   
  29.             if(ret->right != NULL)  
  30.             {  
  31.                 ret->right->parent = ret;  
  32.             }  
  33.         }  
  34.         else  
  35.         {  
  36.             THROW_EXCEPTION(NoEnoughMemoryException,"No memory to create new node ...");  
  37.         }  
  38.     }  
  39.   
  40.     return ret;  
  41. }  

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


    cout<<"Old BTree: "<<endl;

    for(bt.begin();!bt.end();bt.next())
    {
        cout<<bt.current()<<" ";
    }

    cout<<endl<<endl;



    BTree<int> nbt;

    nbt.insert(0,NULL);

    n = nbt.find(0);
    nbt.insert(6,n);
    nbt.insert(2,n);

    n = nbt.find(2);
    nbt.insert(7,n);
    nbt.insert(8,n);

    SharedPointer< BTree<int> > r = bt.add(nbt);

    cout<<"Other Tree : "<<endl;

    for(nbt.begin();!nbt.end();nbt.next())
    {
        cout<<nbt.current()<<" ";
    }

    cout<<endl<<endl;

    cout<<"Add Tree : "<<endl;

    for((*r).begin();!(*r).end();(*r).next())
    {
        cout<<(*r).current()<<" ";
    }


    return 0;
}

                    


7、小结 

            比较操作判断两棵二叉树中的数据元素是否对应相等 

            克隆操作将当前二叉树在堆空间中进行复制 

            相加操作将两棵二叉树中的数据元素在对应位置处相加 

            相加操作的 结果保存在堆空间的一棵二叉树中 



猜你喜欢

转载自blog.csdn.net/qq_39654127/article/details/80524836
今日推荐