二叉搜索树- c++ BST补充说明更改

binary search tree - C++ BST addnote changes

本文关键字:说明 BST 搜索树 c++      更新时间:2023-10-16

我有一个简单的问题。在主要功能中,我做:bsearch_tree bs1;,我在BST树上宣布。然后向树中添加节点。然后我在另一个BST树上宣布:bsearch_tree bs2;,并再次向它添加节点(不同的)。

它所做的是将相同的节点添加到应力bs1和bs2中。因为,当我打印这两棵树时,我看到它们是相同的,但它们不应该是相同的。这是错误的。

我试着调试,发现当我添加节点时,它将它们添加到同一棵树中。

我需要把树区分开来。

我想我必须使类bsearch_tree的新实例,但我不能改变Main函数(限制)。

头文件:

#include<iostream>
using namespace std;
class tnode
{
private:
    double data;
    tnode *left;
    tnode *right;
public:
    tnode(double key);
    friend class bsearch_tree;
    friend void assist(tnode *tmp);
    friend ostream& operator<<(ostream& stream,tnode const *root);
};
class bsearch_tree
{
    tnode *root;
public:
    bsearch_tree();
    bsearch_tree(int);
    void duplicate_tree(tnode *root,tnode **new_root);
    void free_tree(tnode *node);
    void add_value(double v);
    tnode copy(tnode *root);
    bsearch_tree operator + (const bsearch_tree & t);
    bsearch_tree & operator=(const bsearch_tree & v);
    friend void print(bsearch_tree tree);
    friend ostream& operator<<(ostream& stream,bsearch_tree const root);
private:
    void AddNode(double key,tnode *leaf);
    void SumTree(tnode *tree);
};

下面是代码文件:

#include<iostream>
#include "head.h"
using namespace std;
tnode::tnode(double key)
{
    this->data = key;
    this->left = NULL;
    this->right = NULL;
}
bsearch_tree::bsearch_tree()
{
    bsearch_tree *root = new bsearch_tree(NULL);
    //root = NULL;
}
bsearch_tree::bsearch_tree(int)
{
    //bsearch_tree *root = new bsearch_tree(NULL);
    root = NULL;
}
void bsearch_tree::duplicate_tree(tnode *root,tnode **new_root)
{
    if(root == NULL)
        return;
    (**new_root) = copy(root);
}
tnode bsearch_tree::copy(tnode *root)
{
    tnode* node = new tnode(root->data);
    if(root == NULL)
        return *node;
    copy(root->left);
    copy(root->right);
    return *node;
}
void bsearch_tree::free_tree(tnode *node)
{
    if(node == NULL)
        return;
    free_tree(node->left);
    free_tree(node->right);
    free(node);
}
void bsearch_tree::add_value(double v)
{
    tnode *tmp;
    if(root == NULL)
    {
        tmp = new tnode(v);
        root = tmp;
    }
    else
        AddNode(v,root);
}
void bsearch_tree::AddNode(double key,tnode *leaf)
{
    if(key >= leaf->data)
    {
        if(leaf->right != NULL)
            AddNode(key,leaf->right);
        else
        {
            tnode * n = new tnode(key);
            leaf->right = n;
        }
    }
    else
    {
        if(leaf->left != NULL)
            AddNode(key,leaf->left);
        else
        {
            tnode * n = new tnode(key);
            leaf->left = n;
        }
    }
}
void print(bsearch_tree tree)
{
    assist(tree.root);
}
void assist(tnode *tmp)
{
    if(tmp)
    {
        assist(tmp->left);
        cout << tmp->data << endl;
        assist(tmp->right);
    }
}
ostream & operator << (ostream & stream,bsearch_tree const root)
{
    print(root);    
    return stream;
}

bsearch_tree bsearch_tree::operator + (const bsearch_tree & t)
{
    bsearch_tree bs;
    SumTree(t.root);
    return *this;
}
void bsearch_tree::SumTree(tnode *tree)
{
    if(tree)
    {
        AddNode(tree->data,root);
        SumTree(tree->left);
        SumTree(tree->right);
    }
}
bsearch_tree & bsearch_tree::operator = (const bsearch_tree & v)
{
    if(this == &v)
        return *this;
    root = v.root;
    return *this;
}
int main()
{
  bsearch_tree bs1;
  bs1.add_value(16.0);  
  bs1.add_value(14.0);  
  bs1.add_value(6.0);  
  bs1.add_value(18.0);  
  bs1.add_value(17.0);  
  bs1.add_value(4.0);  
  bs1.add_value(5.0);  
  bs1.add_value(1.0);  
  bs1.add_value(26.0);  
  bs1.add_value(22.0);  
  cout << "bs1:" << endl;
  print(bs1);
  bsearch_tree bs2;
  bs1 = bs1 = bs1;
  bs2 = bs1;
  bs2.add_value(40.0);
  bs2.add_value(20.0);
  bs2.add_value(60.0);
  cout << "cout << bs2" << endl;
  cout << bs2;
  bsearch_tree bs3;
  //bs3 = bs1 + bs2;
  bs3 = bs1;
  cout << "cout << bs3" << endl;
  cout << bs3; 
  cin.get();
  return 0;
} // main

所以我的问题是:在主要功能我做bsearch_tree bs1;,然后我添加一些节点到它,像这样:bs1.add_value(16.0);,然后我做bsearch_tree bs2;,再次我添加一些节点到它。然后我输出树bs1和bs2,我发现它们相等,这是不对的。

我如何使add_value方法添加节点到不同的树?因此,当我打印这两棵树时,我将得到不同的树,因为我输入的节点一开始就不同。

谢谢

您的operator=不正确。你设置了一个根,指向第二棵树的同一个根。因此,从使用此操作符的角度(例如,在bs2 = bs1;),您的两个树都处理相同的共享数据。您需要以一种创建树数据副本的方式实现赋值操作符。