二叉树的先序建立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);
[解决办法]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;//
}