遍历BST的麻烦

时间:2013-01-11 14:19:52

标签: 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(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不显示?

2 个答案:

答案 0 :(得分: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。我知道这是一个小问题但是对于那些阅读你的代码的人来说这很烦人 - 包括那些想要给你做作业的人!谢谢: - )

答案 1 :(得分: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);
    }
}