大家帮忙看上初学者写的二叉树哪错了 程序如上

大家帮忙看下菜鸟写的二叉树哪错了 程序如下
#include<iostream>
using namespace std;
struct node
{
int data;
node *left;
node *right;
node():left(NULL),right(NULL)
{
data=0;
}
};

class btree
{
private:
node *root;
public:
btree():root(NULL)
{}
void great(node *r)
{
int num;
cout<<"输入节点信息:"<<endl;
cin>>num;
if(num==0)
r=NULL;
else
{
r=new node;
if(r==NULL)
exit(1);
r->data=num;
great(r->left);
great(r->right);
}
root=r;
}
~btree()
{
destroy(root);
}

void destroy(node *r)
{
if(r!=NULL)
{
destroy(r->left);
destroy(r->right);
delete r;
}
root=NULL;
}
void pretree(node *r)//前序遍历
{
if(r!=NULL)
{
cout<<r->data;
pretree(r->left);
pretree(r->right);
}
}
node* getroot()
{
return root;
}
void midtree(node *r)//中序遍历
{
if(r!=NULL)
{
midtree(r->left);
cout<<r->data;
midtree(r->right);
}
}
void lasttree(node *r)//后序遍历
{
if(r!=NULL)
{
midtree(r->left);
midtree(r->right);
cout<<r->data;
}
}
};
int main()
{
btree bt;
node *nod;
cout<<"pless input the infomation of the node:"<<endl;
bt.great(nod);
cout<<"中序遍历:"<<endl;
bt.midtree(bt.getroot());
getchar();
}


------解决方案--------------------
C/C++ code

#include<iostream>
using namespace std;
struct node
{
    int data;
    node *left;
    
    node *right;
    node():left(NULL),right(NULL)
    {
        
        data=0;
    }
};

class btree
{
private:
    node *root;
public:
    btree():root(NULL)
    {}
void great(node *r)
{
    
    int num;
    cout<<"输入节点信息:"<<endl;
    cin>>num;
    if(num==0)
        r=NULL;
    else
    {
        r=new node;
        if(r==NULL)
            exit(1);
        cout<<"请输入数据: "<<endl;
        r->data=num;
        great(r->left);
        great(r->right);
    }
    root=r;
}
~btree()
{
destroy(root);
}

void destroy(node *r)
{
if(r!=NULL)
{
destroy(r->left);
destroy(r->right);
delete r;
}
root=NULL;
}
void pretree(node *r)//前序遍历
{
if(r!=NULL)
{
cout<<r->data;
pretree(r->left);
pretree(r->right);
}
}
node* getroot()
{
return root;
}
void midtree(node *r)//中序遍历
{
    if(r!=NULL)
    {
        midtree(r->left);
        cout<<r->data;
        midtree(r->right);
    }
}
void lasttree(node *r)//后序遍历
{
if(r!=NULL)
{
midtree(r->left);
midtree(r->right);
cout<<r->data;
}
}
};
int main()
{
    btree bt;
    node *nod=NULL;//防止成为野指针;
    cout<<"pless input the infomation of the node:"<<endl;
    bt.great(nod);
    cout<<"中序遍历:"<<endl;
    bt.midtree(bt.getroot());
    getchar();
}
//只跟你把崩毁的地方修改了一下,我晚上回去再给你看一下。

------解决方案--------------------
C/C++ code
void great(node *r)
{
    
    int num;
    cout<<"输入节点信息:"<<endl;
    cin>>num;
    if(num==0)
        r=NULL;
    else
    {
        r=new node;
        if(r==NULL)
            exit(1);
        cout<<"请输入数据: "<<endl;
        r->data=num;
        great(r->left);
        great(r->right);
    }
    root=r;
}
~btree()
{
destroy(root);
}

------解决方案--------------------
直接传node *p 是不会改变*p参数的值的 所以引用 node* 型指针的地址做参数……