我正在尝试构建自己的二叉搜索树。但是,我的树没有建成。请参阅下面的代码并提供帮助。
#include<iostream>
#include<string>
using namespace std;
class Binarytree
{
private:
struct node
{
int data;
node *left;
node *right;
};
node *root;
public:
Binarytree();
void insertdata(node*,int);
void deletedata();
void printdata(node*);
void userprint(char);
void getdata(int);
};
Binarytree::Binarytree()
{
root=NULL;
cout<<"Setting root as NULL"<<endl;
}
void Binarytree::insertdata(node* temp3,int temp)
{ cout << "in insert data"<<endl;
node Dummy=node();
Dummy.data=temp;
Dummy.left=NULL;
Dummy.right=NULL;
cout << "Data To be inserted is "<<temp <<endl;
if (temp3 == NULL)
{ cout<<"Found NULL ROOT"<<endl;
temp3=&Dummy;
cout << "Entered a Data in tree"<<endl;
cout<<"Data in root"<<root->data<<endl;
}
else if (temp3->data > temp)
{ cout<<"Making a Left Recursive Call"<<endl;
insertdata(temp3->left,temp);
}
else
{ cout<<"Making a right Recursive Call"<<endl;
insertdata(temp3->right,temp);
}
}
void Binarytree::getdata(int check)
{ cout <<"in getdata"<<endl;
cout << "before insertdata"<<endl;
insertdata(root,check);
}
void Binarytree::printdata(node* printrt)
{
if (printrt ==NULL)
cout << "Nothing to print";
else
{ cout << printrt->data << endl;
printdata(printrt->left);
printdata(printrt->right);
}
}
void Binarytree::userprint(char in)
{ node* data;
data=root;
if (in == 'Y' || in == 'y')
printdata(data);
}
void main()
{ Binarytree element=Binarytree();
int userdata,i=0;
bool check = true;
while(check)
{ cout <<"Please Enter your Data"<<endl;
cin >> userdata;
element.getdata(userdata);
cout<<"FUnction returned to main"<<endl;
i++;
if(i==5)
check=false;
}
element.userprint('Y');
}
第一个值未插入根指针。我知道有很多代码可用于此,但如果我不自己编码,我觉得我的学习将是有限的。 所以请帮助我们解决这段代码中的错误。
答案 0 :(得分:0)
真的试图编译,可能还有其他问题......但
更改
void Binarytree::insertdata(node* temp3,int temp)
到
void Binarytree::insertdata(node* &temp3,int temp)
这样在insertdata中创建的节点确实修改了外部指针。
并更改
node Dummy=node();
Dummy.data=temp;
Dummy.left=NULL;
Dummy.right=NULL;
到
node *Dummy=new node();
Dummy->data=temp;
Dummy->left=NULL;
Dummy->right=NULL;
正如我所说,可能还有其他问题......你应该担心删除节点和所有......
另外,您可以在insertdata()之外创建节点并保留相同的签名。
无论如何,祝你好运
答案 1 :(得分:0)
根本原因(如果您原谅双关语)是您向树根添加内容的方式。您的代码在堆栈上创建一个名为Dummy
的临时变量,然后获取其地址。这是第一个错误,因为当函数结束时,临时变量会被破坏。
第二个问题是,为了更改传递给函数的指针的值,必须将指针传递给指针。换句话说,如果您想要实际更改传递的指针而不是原始代码所做的本地副本,那么insertdata(node *, int)
的成员函数必须变为insertdata(node **, int)
。
为了说明这一事实,请尝试使用此代码。
#include <iostream>
int Y = 99;
void makeitsix(int n) {
n = 6;
}
void pointToY(int *ptr) {
ptr = &Y;
}
int main()
{
int x = 5;
int *p = &x;
std::cout << "x = " << x << ", *p = " << *p << std::endl;
makeitsix(x);
pointToY(p);
std::cout << "x = " << x << ", *p = " << *p << std::endl;
return 0;
}
当makeitsix()
被调用时,它只是被更改的n
的本地副本,而不是最初传入的值5。同样,ptr
在{{ 1}}函数仅改变用于从pointToY()
内调用函数的ptr
而不是p
的本地副本。如果不是这样,那么main()
之类的调用会导致一些非常奇怪的效果!
我冒昧地在你的代码中稍微改变一些东西,使它更清洁,包括
makeitsix(3)
结构提供自己的构造函数以及其他一些小事。完整的工作代码如下:
node