首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

二叉树的先序建立,该怎么解决

2013-10-29 
二叉树的先序建立typedef char ElemType//树结构typedef struct tree{ElemType datastruct tree * lchil

二叉树的先序建立
typedef char ElemType;
//树结构
typedef struct tree
{
    ElemType data;
    struct tree * lchild;
    struct tree * rchild;
    unsigned int isOut;   //专为后序遍历设置的,0为不需要被输出,1为需要被输出
}TreeNode,*Tree;



//创建树,以先序序列建立树
void CreateTree(Tree &t)    //我说的指针引用在这
{
    char ch;
    scanf("%c",&ch);
    if ( ch == '#' )
    t = NULL;
    else
    {
    t = (Tree)malloc(sizeof(TreeNode));
        if ( !t )
    {
        printf("分配内存出错!");
        return ;
    }
    t->data = ch;
    CreateTree(t->lchild);
    CreateTree(t->rchild);
    }
}
[code=c]
[/code]



//我不懂的地方在于为什么在创建树时  使用了指针的引用,它很神奇,竟然在创建树的函数中不给返回值,而且,当我去掉&时,程序编译通过,执行会异常终止! 二叉树 指针 异常 遍历
[解决办法]
C直接不能编译;
C++ 指针的引用,是链式结构的福音。
不必再用二级指针了。

引用有指针的能力,而无其弊,刚刚好。
引用是对象的别名,代行对象的权利。

T x;
T &ref =x;

T b =ref;//即T b =x;
T c;
c = ref; //即c =x; 
ref =b;//即 x=b;

&ref // 即& x;

除了名字不同,引用可以代替被引用者,做他所能做的事情。
引用参数,也可以代替被引用者,做他所能做的事情。

不受参数值传递的约束。
引用参数不是值传递。

非引用参数,都是值传递。

C没有引用,只有值传递。
C++有了引用,多了引用传递,这一种参数传递手段。

引用传递的实质,是传递地址;
只是表面上,用实参本身做参数,传递给被调函数。
和值传递有本质的区别。

C的指针参数,只是模拟地址传递,语法上还是值传递。
通过传递指针,用指针间接引用指针指向的对象,

C++引用传递,实参即被引用的对象;
形参在被调函数中代表实参本身。

作用和指针差不多。
但是语法上和直接使用实参本身是一致的。
函数调用语法,则和值传递一致。

这表明,引用是一种特殊数据类型。
既不同于指针,也不同于对象。

他代替被引用的对象工作,一切结果,都和被引用的对象自己工作相同。







[解决办法]
void InitialBitTree(BitTree * T)
{//初始化二叉树
int n;
cout<<"input n: \n";
cin>>n;
if(n==0)
T=NULL;
else
{
if(!(T=new BitTree))exit(-1);
T->e = n;
InitialBitTree(T->lchild) ;
InitialBitTree(T->rchild) ;
}
}
我用的是整型,没错吖。调用时:
InitialBitTree(T);
[解决办法]
引用:
代码放在代码块,看着清晰:
void InitialBitTree(BitTree * T)
{//初始化二叉树
int n;
cout<<"input n: \n";
cin>>n;
if(n==0)
T=NULL;
else
{
if(!(T=new BitTree))exit(-1);
T->e = n;
InitialBitTree(T->lchild) ;
InitialBitTree(T->rchild) ;
}
}

我用的是整型,没错吖。调用时:
InitialBitTree(T);


InitialBitTree(T); 以后实参T 没有变化;

只是在函数InitialBitTree 内部形参 T发生了改变。
结果是,函数InitialBitTree 创建了一棵树,但是传递不出函数。并造成内存泄露。
实参T并没有接收到创建了的那棵树。
定义为 
void InitialBitTree(BitTree *&T)

InitialBitTree(T); 
就真正创建一棵树了。
C++ 二叉树

.....
 void InitialBitTree(BitTree *& T)
{//初始化二叉树
int n;
cout<<"input n: \n";
cin>>n;
if(n==0)
T=NULL;
else
{
if(!(T=new BitTree))exit(-1);
  T->e = n;
InitialBitTree(T->lchild) ;
InitialBitTree(T->rchild) ;
}
}
int main(){
BitTree * T=NULL;
InitialBitTree(T);
.....
//记住销毁二叉树,释放结点占用的内存
return 0;//
}


引用参数,采用引用传递,实参会接收形参的改变。
如果是C代码,由于只能值传递,只有使用二级指针。
C++ 二叉树:

.....
 void InitialBitTree(BitTree ** T)
{//初始化二叉树
int n;
cout<<"input n: \n";
cin>>n;
if(n==0)
*T=NULL;
else
{
if(!(*T=new BitTree))exit(-1);
(*T)->e = n;
InitialBitTree(&(*T)->lchild) ;
InitialBitTree(&(*T)->rchild) ;
}
}
int main(){
BitTree * T=NULL;
InitialBitTree(&T);
.....
//记住销毁二叉树,释放结点占用的内存
return 0;//
}

热点排行