1. 引用

递归构造二叉树的过程中用到了 C++ 语言中的引用 &,引用 & 是变量别名的意思,除了变量名不一样,其他的都是指同一个东西。传参的方式有两种:一种是传值;一种是传址。引用 & 的使用使得传址操作起来更加方便。举例如下

#include <stdio.h>
#include <string.h>void Mov1(const char* str) {   //传递字符串指针的值str++;
}void Mov2(const char** str) {  //传递字符串指针的地址(*str)++;
}void Mov3(const char*& str) {  //传递字符串指针的引用str++;
}int main() {const char* str = "abcde";printf("%s\n", str);Mov1(str);printf("%s\n", str);Mov2(&str);printf("%s\n", str);Mov3(str);printf("%s\n", str);return 0;
}

程序的输出结果如下:

从结果可以看出,对于字符串指针,当传递该指针的值进行++时,调用函数内部对该指针的修改并不会影响到主函数中的值,这正是传值方式的特点。要想将调用函数对字符串指针的修改带回到主函数里,就需要用到二级指针,也就是传递字符串指针的地址。从上面的结果也可以看出 Mov2 函数,接收了指针的地址,所以在 Mov2 函数内部对指针的修改会被带出来。引用使得这种操作更加方便,Mov3 函数接收了一个 const char *& 类型的参数,该参数正是一个指向字符串常量的指针的引用。将 Mov2 和 Mov3 函数实现进行对比,Mov3 的内部实现确实更加容易理解,代码也更加简洁,二者实现了相同的功能,这正是 C++ 中引入引用概念的目的之一。

2. 创建二叉树

const char *str = "ABC##DE##F##G#H##"

二叉树用一个字符串常量表示,其中 # 表示空树,则上面代表的二叉树如下

下面是一个错误代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>//二叉链表的实现
typedef char ElemType;typedef struct BtNode {   //二叉树节点类型ElemType data;struct BtNode* leftchild;struct BtNode* rightchild;
}BtNode, *BinaryTree;BtNode* Buynode() {    //为新节点申请空间BtNode* s = (BtNode*)malloc(sizeof(BtNode));if (nullptr == s) exit(1);memset(s, 0, sizeof(BtNode));return s;
}void PreOrder(BtNode* ptr) {   //先序遍历if (nullptr != ptr) {printf("%c ", ptr->data);PreOrder(ptr->leftchild);PreOrder(ptr->rightchild);}
}void InOrder(BtNode* ptr) {        //中序遍历if (nullptr != ptr) {InOrder(ptr->leftchild);printf("%c ", ptr->data);InOrder(ptr->rightchild);}
}void PastOrder(BtNode* ptr) {  //后序遍历if (nullptr != ptr) {PastOrder(ptr->leftchild);PastOrder(ptr->rightchild);printf("%c ", ptr->data);}
}BtNode* CreateBtNode(const char* str) {    //创建节点BtNode* s = nullptr;if (*str != '#') {s = Buynode();s->data = *str;s->leftchild = CreateBtNode(++str);s->rightchild = CreateBtNode(++str);}return s;
}BtNode* CreateTreeStr(const char* str) {   //创建树if (nullptr == str || strlen(str) <= 0) return nullptr;else return CreateBtNode(str);
}//测试
int main() {const char* str = "ABC##DE##F##G#H##";BinaryTree root = CreateTreeStr(str);PreOrder(root);printf("\n");InOrder(root);printf("\n");PastOrder(root);printf("\n");return 0;
}

程序输出结果如下:

结果显示所构造的二叉树如下

原因就在于 CreatBtNode 函数接收的是一个字符串常量指针的值,在递归调用过程中,调用函数内部对指针的修改未能带出来,调试过程如下

需要修改的地方就是将 CreatBtNode 函数的参数改成指针的引用

将
BtNode* CreateBtNode(const char* str)
改成
BtNode* CreateBtNode(const char*& str)

修改后的代码调试过程如下

代码的最终运行结果如下

C语言——二叉树的创建(二叉链表)相关推荐

  1. 计算二叉树宽度(二叉链表)

    通过层次遍历计算二叉树的宽度: int Broad(BiTree T) {if (T){BiTree p=NULL;queue<BiTree> Q;Q.push(T);int max = ...

  2. C语言递归实现二叉树(二叉链表)的三种遍历和销毁操作(实验)

    今天写的是二叉树操作的实验,这个实验有三个部分: ①建立二叉树,采用二叉链表结构 ②先序.中序.后续遍历二叉树,输出节点值 ③销毁二叉树 二叉树的节点结构定义 typedef struct BiTNo ...

  3. 二叉链表-创建、遍历(前序、中序、后序、非递归、层次)、复制、计算深度、结点数、销毁(C语言)

    目录 二叉树的定义 二叉树的性质 二叉链表的基本操作 二叉链表的结构定义 前序遍历创建 前序.中序.后序遍历 中序遍历的非递归算法(栈) 层次遍历(队列) 复制二叉树 计算深度 计算总结点数与叶子结点 ...

  4. 数据结构C++边学边做--二叉树的实现(二叉链表实现遍历操作)

    二叉树的实现(二叉链表实现遍历操作) 一.二叉树的遍历 二.二叉链表的数据结构定义 三.二叉链表类实现 1.类声明 2.BiTree->构造函数:Create创建二叉链表 3.~BiTree-& ...

  5. 基于二叉链表的二叉树高度的计算

    描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写递归算法计算二叉树的高度. 输入 多组数据.每组数据一行,为二叉树的前序序列(序列中元素为'0'时,表示该结点为空).当输 ...

  6. 理论基础 —— 二叉树 —— 二叉链表

    [二叉链表] 二叉树一般采用二叉链表存储,其基本思想是:令二叉树的每个结点对应一个链表结点,链表结点除了存放与二叉树结点有关的数据信息外,还要设置指示左右孩子的指针. template<clas ...

  7. 数据结构-二叉链表的结构与实现

    目录 一.引言 二.什么是二叉链表 三.二叉链表的结构 四.二叉链表的实现 1. 创建二叉链表 2. 遍历二叉链表 3. 插入节点 4. 删除节点 五.应用场景 六.总结 七.代码示例 一.引言 数据 ...

  8. C++二叉链表的层次遍历

    二叉链表可以用递归算法实现先序遍历,中序遍历和后序遍历,也可以利用栈进行先序遍历,中序遍历和后序遍历.同时,二叉链表也可以借助队列实现层次遍历,基本思想如下: 1. 创建二叉链表,创建对咧 2. 将只 ...

  9. C语言实现二叉树(二叉链表)

    文章目录 定义结构体 初始化 先序遍历创建二叉树 方法一 测试 方法二:根据所给的字符串序列创建 其他方法 树的结点大小 树的高 判断树空 找某个结点的左孩子和右孩子 找某个结点的父节点 查找元素 拷 ...

最新文章

  1. Debian中编译内核
  2. (原创)INTERVAL分区表与RANGE分区表相互转化
  3. 《C# 程序员的自我修养》送书活动结果公布
  4. 互联网日报 | 4月18日 星期日 | 水滴公司递交赴美IPO申请;极狐阿尔法S首发上市;盒马X会员店6月进京...
  5. python 单向链表
  6. b站全站排行刷新去掉观看
  7. 个人手写笔记,灵感收集.
  8. java file 其他电脑上_将MultipartFile转换为java.io.File而不复制到本地计算机
  9. 系统集成项目管理工程师和网络工程师哪个好考?
  10. 转载:十款主流科研绘图软件
  11. Freyja2版本对分库分表的处理方式
  12. unbuntu 中部署jenkins
  13. 【mixly】APDS9960第三方库开发
  14. 1字节是多少位,汉字utf-8又占多少。
  15. 猿辅导python面试_猿辅导西安少儿编程班主任面试:为什么选择猿辅导 猿辅导是一个 - 职朋职业圈...
  16. BZOJ 1022 [SHOI2008]小约翰的游戏John
  17. 蚁群算法(ant system,AS)
  18. 五年北京,这个改变我命运的城市,终于要离开了
  19. php冰蝎一句话,利用动态二进制加密实现新型一句话木马之PHP篇(转)冰蝎
  20. java毕业设计的自助旅游导航系统mybatis+源码+调试部署+系统+数据库+lw

热门文章

  1. 全国一级计算机证书可以入户东莞吗,哪些证书可以达到入户东莞的资格
  2. RealAudio1
  3. 2006信息技术会考复习(理论复习)
  4. 这么爆炸的计算机考研,谁还在意国家线?
  5. Java线程面试题合集(含答案)
  6. linux中Gy模式什么意思,Linux必学的60个命令 -其他
  7. 达梦数据库常用图形化工具介绍
  8. php 缩放再裁剪,10.4 图像缩放和裁剪技术
  9. ESP32/ESP8266 OTA服务器搭建
  10. TCP和UDP的异同