热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用先序遍历构建二叉树的方法

typedefcharElemType;树结构typedefstructtree{ElemTypedata;structtree*lchild;
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]



//我不懂的地方在于为什么在创建树时  使用了指针的引用,它很神奇,竟然在创建树的函数中不给返回值,而且,当我去掉&时,程序编译通过,执行会异常终止!

8 个解决方案

#1


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);
    }
}
//我不懂的地方在于为什么在创建树时  使用了指针的引用,它很神奇,竟然在创建树的函数中不给返回值,而且,当我去掉&时,程序编译通过,执行会异常终止! 

#2


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++引用传递,实参即被引用的对象;
形参在被调函数中代表实参本身。

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

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

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






#3


大神,能讲得具体一点吗

#4


大姐,你太强了,德问上也看到你发了

#5


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

#6


引用 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;//
}

#7


后面的C++ 二叉树:应该是C二叉树

#8


太谢谢你了,@lm_whales,说的很对

推荐阅读
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 加密世界下一个主流叙事领域:L2、跨链桥、GameFi等
    本文介绍了加密世界下一个主流叙事的七个潜力领域,包括L2、跨链桥、GameFi等。L2作为以太坊的二层解决方案,在过去一年取得了巨大成功,跨链桥和互操作性是多链Web3中最重要的因素。去中心化的数据存储领域也具有巨大潜力,未来云存储市场有望达到1500亿美元。DAO和社交代币将成为购买和控制现实世界资产的重要方式,而GameFi作为数字资产在高收入游戏中的应用有望推动数字资产走向主流。衍生品市场也在不断发展壮大。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
author-avatar
球球小白痴_693
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有