树不建

时间:2014-03-28 19:25:45

标签: c++ tree

我正在尝试构建自己的二叉搜索树。但是,我的树没有建成。请参阅下面的代码并提供帮助。

#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');

}

第一个值未插入根指针。我知道有很多代码可用于此,但如果我不自己编码,我觉得我的学习将是有限的。 所以请帮助我们解决这段代码中的错误。

2 个答案:

答案 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()之类的调用会导致一些非常奇怪的效果!

我冒昧地在你的代码中稍微改变一些东西,使它更清洁,包括

  1. makeitsix(3)结构提供自己的构造函数
  2. 为Binarytree创建一个提取器
  3. 删除各种诊断打印输出语句(为简洁起见)
  4. 使树打印输出看起来更像树,左边是根,右边是树枝
  5. 将一些成员函数设为私有
  6. 以及其他一些小事。完整的工作代码如下:

    node