二叉搜索树- c++ BST补充说明更改
binary search tree - C++ BST addnote changes
我有一个简单的问题。在主要功能中,我做: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
;),您的两个树都处理相同的共享数据。您需要以一种创建树数据副本的方式实现赋值操作符。
相关文章:
- 如何在BST的这个简单递归实现中消除警告
- 当使用通配符和null指针调用函数时,对输出的说明
- 关于C++中具有多重继承"this"指针的说明
- 16 位到 10 位转换代码说明
- C++ 基本 CTOR 说明 - 为什么不调用赋值/复制构造函数
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- 如何提高BST的搜索操作效率?
- 如何在BST树中对数字的乘积收费?
- 编译器指出结构和 int 说明的错误 2059
- 随机数生成函数说明
- 赋值到类型和空大括号. 语法说明
- C++ switch 语句:对案例进行分组,并针对每个案例给出特定的说明
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- std::extent 实现详细信息说明
- 尝试使用C++中的模板进行BST排序,但在使用随机字符串进行测试时不起作用
- 您好,我实际上想了解以下代码.有人可以详细说明代码它到底在做什么吗?为什么它会在第 31 行崩溃
- 比较C++中两个BST的节点
- 如何理解"Temporary objs are destroyed as the last step in evaluating the full-expression"?谁能用一些简单的例子来说明这
- 有没有办法我可以在 C++ 中使用 if 语句来说明如果一个字符串不是两个名称的 eqal,它会给出一个输出,ATM i
- 二叉搜索树- c++ BST补充说明更改