二叉树的先序建立

是吻过的尘埃风过 2013-10-26 03:19:51
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]



//我不懂的地方在于为什么在创建树时 使用了指针的引用,它很神奇,竟然在创建树的函数中不给返回值,而且,当我去掉&时,程序编译通过,执行会异常终止!
...全文
148 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
太谢谢你了,@lm_whales,说的很对
lm_whales 2013-10-27
  • 打赏
  • 举报
回复
后面的C++ 二叉树:应该是C二叉树
lm_whales 2013-10-27
  • 打赏
  • 举报
回复
引用 5 楼 u012540439 的回复:
代码放在代码块,看着清晰:
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;//
}
冥辰mc 2013-10-27
  • 打赏
  • 举报
回复
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);
UTTP 2013-10-26
  • 打赏
  • 举报
回复
大姐,你太强了,德问上也看到你发了
  • 打赏
  • 举报
回复
大神,能讲得具体一点吗
lm_whales 2013-10-26
  • 打赏
  • 举报
回复
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++引用传递,实参即被引用的对象; 形参在被调函数中代表实参本身。 作用和指针差不多。 但是语法上和直接使用实参本身是一致的。 函数调用语法,则和值传递一致。 这表明,引用是一种特殊数据类型。 既不同于指针,也不同于对象。 他代替被引用的对象工作,一切结果,都和被引用的对象自己工作相同。
  • 打赏
  • 举报
回复
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);
    }
}


//递归先序遍历
void PreOrder(Tree t)
{
    if ( t )
    {
    printf("%c",t->data);
    PreOrder(t->lchild);
    PreOrder(t->rchild);
    }
}
//我不懂的地方在于为什么在创建树时  使用了指针的引用,它很神奇,竟然在创建树的函数中不给返回值,而且,当我去掉&时,程序编译通过,执行会异常终止! 

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧