热门标签 | 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,说的很对

推荐阅读
  • c语言二元插值,二维线性插值c语言
    c语言二元插值,二维线性插值c语言 ... [详细]
  • 编译原理中的语法分析方法探讨
    本文探讨了在编译原理课程中遇到的复杂文法问题,特别是当使用SLR(1)文法时遇到的多重规约与移进冲突。文章讨论了可能的解决策略,包括递归下降解析、运算符优先级解析等,并提供了相关示例。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 本文通过分析一个具体的案例,探讨了64位Linux系统对32位应用程序的兼容性问题。案例涉及OpenVPN客户端在64位系统上的异常行为,通过逐步排查和代码测试,最终定位到了与TUN/TAP设备相关的系统调用兼容性问题。 ... [详细]
  • 本题要求计算一组正整数的最小公倍数(LCM)。输入包括多组测试数据,每组数据首先给出一个正整数n,随后是n个正整数。 ... [详细]
  • 题目编号:2049 [SDOI2008]Cave Exploration。题目描述了一种动态图操作场景,涉及三种基本操作:断开两个节点间的连接(destroy(a,b))、建立两个节点间的连接(connect(a,b))以及查询两节点是否连通(query(a,b))。所有操作均确保图中无环存在。 ... [详细]
  • RTThread线程间通信
    线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ... [详细]
  • 本文详细介绍了如何在Windows操作系统中配置和使用Lex(Flex)与Yacc(Bison),包括软件的下载、安装以及通过示例验证其正确性的步骤。 ... [详细]
  • 本文详细介绍了如何在循环双链表的指定位置插入新元素的方法,包括必要的步骤和代码示例。 ... [详细]
  • 本文档介绍了如何使用ESP32开发板在STA模式下实现与TCP服务器的通信,包括环境搭建、代码解析及实验步骤。 ... [详细]
  • 线段树详解与实现
    本文详细介绍了线段树的基本概念及其在编程竞赛中的应用,并提供了一个具体的线段树实现代码示例。 ... [详细]
  • 本文介绍了如何利用X_CORBA实现远程对象调用,并通过多个示例程序展示了其功能与应用,包括基础的Hello World示例、文件传输工具以及一个完整的聊天系统。 ... [详细]
  • C语言中的结构体详解
    本文详细介绍了C语言中的结构体,包括结构体的声明、初始化、成员访问以及传参等方面的知识。 ... [详细]
  • 首部|接口类型_OSI 7层模型 & TCP/IP协议首部封装格式解析
    首部|接口类型_OSI 7层模型 & TCP/IP协议首部封装格式解析 ... [详细]
  • 在构建 Caffe 时,可能会遇到与 Protobuf 版本不兼容导致的链接错误。本文将详细介绍这些错误及其解决方案。 ... [详细]
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社区 版权所有