C++ 穿越BST的麻烦
我开始学习树,并尝试为BST编写代码。不幸的是,我无法显示树数据。我正在尝试实现深度优先遍历。但我不知道如何实施它。下面是我的代码C++ 穿越BST的麻烦,c++,binary-search-tree,C++,Binary Search Tree,我开始学习树,并尝试为BST编写代码。不幸的是,我无法显示树数据。我正在尝试实现深度优先遍历。但我不知道如何实施它。下面是我的代码 #include<iostream> using namespace std; class node { public: int data; node *left,*right; }; class btree { private: node *root; public: btree(){root=NULL;} void insert(in
#include<iostream>
using namespace std;
class node
{
public:
int data;
node *left,*right;
};
class btree
{
private:
node *root;
public:
btree(){root=NULL;}
void insert(int value)
{node *temp=new node;
if(root == NULL)
{
temp->right=NULL;
temp->data=value;
temp->left=NULL;
root=temp;
}
else
insertHelper(root, value);
}
void insertHelper(node* Node, int value)
{
if(value < Node->data)
{
if(Node->left == NULL)
{
Node->left=new node;
Node->left->data=value;
Node->left->left=NULL;
Node->left->right=NULL;
}
else
insertHelper(Node->left, value);
}
else
{
if(Node->right== NULL)
{
Node->right = new node;
Node->right->data=value;
Node->right->left=NULL;
Node->right->right=NULL;
}
else
insertHelper(Node->right, value);
}
}
void disp()
{node*tmp=root;
if(tmp==NULL)
cout<<"empty"<<endl;
else
{
cout<<tmp->data<<endl;
disphelper(tmp);
}
}
void disphelper(node *tmp)
{
if(tmp->left!=NULL)
{
cout<<tmp->left->data<<endl;
tmp=tmp->left;
disphelper(tmp);}
if(tmp->right!=NULL)
{
cout<<tmp->right->data<<endl;
tmp=tmp->right;
disphelper(tmp);
}
}
};
int main()
{
btree binarytree;
binarytree.disp();
binarytree.insert(10);
binarytree.insert(5);
binarytree.insert(30);
binarytree.disp();
}
有人能告诉我为什么不显示30吗?这里没有任何输出的原因是,在
disphelper()
中,您首先检查左侧节点是否为NULL
,然后在递归到它时更改它。当您递归到右侧节点时也是如此
void disphelper(node *tmp)
{
if(tmp->left!=NULL)
{
cout<<tmp->left->data<<endl;
//tmp=tmp->left; // Get rid of this.
disphelper(tmp->left); // Use this.
}
if(tmp->right!=NULL)
{
cout<<tmp->right->data<<endl;
//tmp=tmp->right; // Get rid of this
disphelper(tmp->right); // Use this.
}
}
void disphelper(节点*tmp)
{
如果(tmp->left!=NULL)
{
coutdataleft);//使用这个。
}
如果(tmp->右!=空)
{
coutdataright);//使用这个。
}
}
只需传入left或right节点,而不是更改temp的值(两个比较的值应该相同)
还有两件事。首先,您正在疯狂地泄漏内存:在insert()
中,您每次都创建一个新对象,但只在第一次使用它,每隔一次它泄漏一次。您的节点
类应该使用一个析构函数来删除两个节点,从而保护内存
第二,在你发布代码之前,你能麻烦格式化它以便缩进是一致的吗?这不是过去的痛苦,很多编辑会为你做,或者你可以使用优秀的。我知道这是一个很小的问题,但是对于那些阅读你的代码的人来说,这很恼火——包括,可能是那个给你做作业打分的人!谢谢:-)这里没有得到任何输出的原因是,在
disphelper()
中,您首先检查左侧节点是否为NULL
,然后在递归到它时更改它。当您递归到右侧节点时也是如此
void disphelper(node *tmp)
{
if(tmp->left!=NULL)
{
cout<<tmp->left->data<<endl;
//tmp=tmp->left; // Get rid of this.
disphelper(tmp->left); // Use this.
}
if(tmp->right!=NULL)
{
cout<<tmp->right->data<<endl;
//tmp=tmp->right; // Get rid of this
disphelper(tmp->right); // Use this.
}
}
void disphelper(节点*tmp)
{
如果(tmp->left!=NULL)
{
coutdataleft);//使用这个。
}
如果(tmp->右!=空)
{
coutdataright);//使用这个。
}
}
只需传入left或right节点,而不是更改temp的值(两个比较的值应该相同)
还有两件事。首先,您正在疯狂地泄漏内存:在insert()
中,您每次都创建一个新对象,但只在第一次使用它,每隔一次它泄漏一次。您的节点
类应该使用一个析构函数来删除两个节点,从而保护内存
第二,在你发布代码之前,你能麻烦格式化它以便缩进是一致的吗?这不是过去的痛苦,很多编辑会为你做,或者你可以使用优秀的。我知道这是一个很小的问题,但是对于那些阅读你的代码的人来说,这很恼火——包括,可能是那个给你做作业打分的人!谢谢:-)将您的代码修改为
void disphelper(node *tmp)
{
if(tmp == NULL)
return;
cout<<tmp->data<<endl; // print data for current node
if(tmp->left!=NULL) // traverse left branch
{
//cout<<tmp->left->data<<endl;
//tmp=tmp->left;
disphelper(tmp->left);}
if(tmp->right!=NULL) // traverse right branch
{
//cout<<tmp->right->data<<endl;
//tmp=tmp->right;
disphelper(tmp->right);
}
}
void disphelper(节点*tmp)
{
if(tmp==NULL)
返回;
无法将代码修改为
void disphelper(node *tmp)
{
if(tmp == NULL)
return;
cout<<tmp->data<<endl; // print data for current node
if(tmp->left!=NULL) // traverse left branch
{
//cout<<tmp->left->data<<endl;
//tmp=tmp->left;
disphelper(tmp->left);}
if(tmp->right!=NULL) // traverse right branch
{
//cout<<tmp->right->data<<endl;
//tmp=tmp->right;
disphelper(tmp->right);
}
}
void disphelper(节点*tmp)
{
if(tmp==NULL)
返回;
可以使用调试器逐行检查代码。它将帮助您比在此处询问更快地找到问题。使用调试器逐行检查代码。它将帮助您比在此处询问更快地找到问题。谢谢。以前我使用while循环,然后切换到递归。所以完全忘了删除tmp=tmp->left
和tmp=tmp->right
。感谢您指出内存泄漏。:)谢谢。以前我使用while循环,然后切换到递归。所以完全忘记了删除tmp=tmp->left
和tmp=tmp->right
。感谢您也指出内存泄漏。:)