C++ 穿越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

我开始学习树,并尝试为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(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
。感谢您也指出内存泄漏。:)