0

我开始学习树并尝试为 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();
}

输出是

empty
10
5

谁能告诉我为什么不显示30?

4

2 回答 2

2

你在这里没有得到任何输出的原因是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.
        }
    }

而不是更改 temp 的值,这对于两个比较应该是相同的,只需传入左节点或右节点。

另外两件事。首先,您在这里疯狂地泄漏内存:在您的insert()中,您每次都创建一个新对象,但仅在第一次使用它,每隔一次泄漏。您的node类应该通过删除两个节点的析构函数来处理内存。

其次,在你发布代码之前,你能不能麻烦把它格式化一下,让缩进保持一致?这不是以前做这件事的痛苦——很多编辑会为你做这件事,或者你可以使用优秀的Astyle。我知道这是一个小问题,但对于那些阅读你的代码的人来说,这很烦人——包括,大概是那个会给你做作业的人!谢谢 :-)

于 2013-01-11T14:39:01.823 回答
2

将您的代码修改为

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 disp()
{node*tmp=root;
if(tmp==NULL)
    cout<<"empty"<<endl;
else
    {   
        disphelper(tmp);
    }
}
于 2013-01-11T14:47:53.117 回答