一、运行环境简介

编辑器:VSCode + MicroSoft原生插件;

:cat:‍:dragon:运行环境: MinGW ;

:cat:‍:bust_in_silhouette:常用指令: gcc mian.c -o mian.exe

二、二叉树的定义

这里我们直接采用浙大数据结构课程中的代码。因为这种写法清晰明了,且便于后续扩展。

typedef char ElementType;typedef struct TNode *Position; /* 结构体指针 */
typedef Position BinTree; /* 二叉树类型 */
struct TNode{ /* 树结点定义 */ElementType Data; /* 结点数据 */BinTree Left;     /* 指向左子树 */BinTree Right;    /* 指向右子树 */
}TNode;
复制代码

三、如何创建一个二叉树?

先看代码再分析

void CreateBinaryTree ( BinTree *T ) {ElementType ch;scanf("%c",&ch);if (ch == '#')*T = NULL;else {*T = (BinTree)malloc(sizeof(TNode));(*T)->Data = ch;CreateBinaryTree(&((*T)->Left));CreateBinaryTree(&((*T)->Right));}
}
复制代码

1.解决此函数的形参疑问

我们知道,二叉树的类型被我们定义为 BinTree ,而它的原类型是指向二叉树结点 TNode 的指针。我一开始犯的错误是,我认为直接传入这里的指针 BinTree 给函数 CreateBinaryTree() 就可以得到创建的二叉树。事实上这里需要传入指针的指针,即这个结构体指针的地址 *BinTree 。 也就是说,我们事实上传入的是 ** TNode ,即结点指针的指针。而采用上面的定义,就相当于是一个降维的过程,我们可以少写一个*。

为什么要传入结点指针的指针呢?我的理解是,我们所使用的数据结构二叉树在基本操作中就依赖于指针,这相当于我们一开始就在操控指针(比如不修改二叉树的一些操作——先序中序后序遍历中,我们用到了指针),但这些指针是包含在二叉树这个类型中的,打个比方,就相当于一个没有取得其地址的普通类型。所以我们需要修改二叉树的时候,我们要考虑取所谓“普通类型”的地址,即我们要取指针的地址,因此我们会在 CreateBinaryTree() 中传入结点指针的指针,即 ** TNode ,又即 *Bintree

2.对代码的一些说明

这里建立的二叉树,实际上是扩展二叉树,这里采用先序遍历的顺序依次输入结点的值( char 类型),用 '#' 代表空结点。

例如:创建二叉树:第一层为A,第二层为B、C,第三层为D、F,D为B的左孩子,F为C的右孩子;我们需要输入 ABD###C#F##

四、二叉树的遍历——递归实现

3种递归实现仅仅是输出语句顺序不同。

其实现原理为

二叉树的先中后序遍历中经过的结点路径是一样的,但是访问各结点的时机不同,每个结点都会被经过三次,第一次经过就printf是先序,同理第二次printf是中序,第三次是后序。

1.先序遍历

void PreOrderTraversal ( BinTree BT ) {if ( BT ) {printf("%c", BT->Data);PreOrderTraversal( BT->Left );PreOrderTraversal( BT->Right );}
}
复制代码

2.中序遍历

void InOrderTraversal ( BinTree BT ) {if ( BT ) {PreOrderTraversal( BT->Left );printf("%c", BT->Data);PreOrderTraversal( BT->Right );}
}
复制代码

3.后序遍历

void PostOrderTraversal ( BinTree BT ) {if ( BT ) {PostOrderTraversal( BT->Left );PostOrderTraversal( BT->Right );printf("%c", BT->Data);}
}
复制代码

五、其他操作

1.先序遍历输出二叉树叶子结点

void PreOrderPrintLeaves ( BinTree BT ) {if ( BT ) {if ( !BT->Left && !BT->Right )printf("%c", BT->Data);PreOrderPrintLeaves( BT->Left );PreOrderPrintLeaves( BT->Right );}
}
复制代码

2.后序遍历求二叉树的高度

int PostOrderGetHeight ( BinTree BT) {int HL, HR, MaxH;if ( BT ) {HL = PostOrderGetHeight( BT->Left );HR = PostOrderGetHeight( BT->Right );MaxH = ( HL > HR ) ? HL : HR;return (MaxH + 1);}elsereturn 0;
}
复制代码

六、测试

程序结构:

头文件为BTree.h,里面包含上述代码。主要程序文件为main.c,包含代码如下:

#include<stdio.h>
#include<stdlib.h>
#include"BTree.h"int main() {BinTree myTree;printf("Create your Binary Tree:n");CreateBinaryTree(&myTree);printf("n PreOrder:");PreOrderTraversal(myTree);printf("n InOrder:");InOrderTraversal(myTree);printf("n PostOrder:");PostOrderTraversal(myTree);printf("n Leaves:");PreOrderPrintLeaves(myTree);printf("n");int high = PostOrderGetHeight(myTree);printf("The height of the tree: %4d", high);return 0;
}
复制代码

测试结果如下:

点击链接领取资料,先到先得:

点击链接:领取新手礼包,学习资料​jq.qq.com

c++ 结构体遍历_二叉树(Binary Tree)的建立与遍历——C语言实现相关推荐

  1. c++ 结构体赋值_《零基础看得懂的C语言入门教程》—(十二)结构体是这么回事

    一.学习目标 了解C语言的结构体的使用方法 了解C语言结构体的结构的赋值 了解多种C语言结构体变量的赋值方法和取值方法 目录 <零基础看得懂的C语言入门教程>--(二)简单带你了解流程 & ...

  2. java实现二叉树的后序遍历_二叉树前序中序后序遍历(Java实现)

    基于对数组和链表的存储优缺点分析,这里按照需求引进了一种新的数据结构,树 它可以在增删改查上都保持高效率 创建如下图所示的二叉树,并分别使用三种顺序遍历: 代码实现: package Tree; pu ...

  3. 由任意二叉树的前序遍历序列和中序遍历序列求二叉树的思想方法_算法与数据结构基础 - 二叉树(Binary Tree)...

    二叉树基础 满足这样性质的树称为二叉树:空树或节点最多有两个子树,称为左子树.右子树, 左右子树节点同样最多有两个子树. 二叉树是递归定义的,因而常用递归/DFS的思想处理二叉树相关问题,例如Leet ...

  4. 『数据结构与算法』解读树(Tree)和二叉树(Binary Tree)!

    『数据结构与算法』解读树(Tree)和二叉树(Binary Tree)! 文章目录 一. 树 1.1. 树的定义 1.2. 树的基本术语 1.3. 树的性质 二. 二叉树 2.1. 二叉树的定义 2. ...

  5. 【数据结构】二叉树 (Binary Tree)

    目录 一. 什么是树? 二. 二叉树 特殊二叉树 二叉树的性质 二叉树的存储 二叉树的遍历 二叉树的基本操作 一.什么是树? 之前咱们学习了一些简单的数据结构,如顺序表,链表,这些都是线性结构,线性结 ...

  6. 二叉树 Binary Tree

    我怀着激动的心 走上了这颗树 今天是2021年11月12日 今天开始上树!!!!!! 生活中的树形结构: 树:  根节点: 一棵树有且只有一个根节点就是最上面的节点 兄弟节点: 每一行的节点  它们具 ...

  7. mysql如何二叉树遍历_二叉树遍历

    二叉树的遍历方式分别为:前序遍历.中序遍历.后序遍历. 前序遍历: 先访问根节点,再访问左节点,最后访问右节点 中序遍历: 先访问左节点,再访问根节点,最后访问右节点 后序遍历: 先访问左节点,再访问 ...

  8. LeetCode 145. Binary Tree Postorder Traversal--后序遍历--先序遍历反向输出--递归,迭代--C++,Python解法

    题目地址:Binary Tree Postorder Traversal - LeetCode Given a binary tree, return the postorder traversal ...

  9. 深度优先遍历_二叉树的深度优先遍历,理解框架真的能够套用题目吗?不了解执行过程可能很难。...

    显然这是一个很普通的二叉树的深度优先遍历,从中可以提取出这样的框架: class TreeNode { int val; TreeNode left, right; } public void isF ...

最新文章

  1. MyBatis框架学习DAY_01:概念/创建运行流程
  2. Scrapy框架基础使用
  3. php引入路径配置,require.js的路径配置和css的引入方法详解
  4. 程序员,如何摆脱平庸?
  5. TranslateMessage ,GetMessage, DispatchMessage分析
  6. linux 火狐无法执行二进制文件_尝试在Linux上运行Shell脚本时“无法执行二进制文件”...
  7. pb65 xp 安装无反应_长春优质AFB型耐腐蚀泵安装
  8. 前端学习(1034):jquery插件-全屏滚动
  9. 云开发的数据库权限机制解读丨云开发101
  10. windows程序窗体创建流程模型A--发送自定义消息逻辑上出现Bug
  11. android 蓝牙连接obd,Android蓝牙连接汽车OBD设备
  12. tensorflow如何微调时如何只训练后两层_TensorFlow官方发布剪枝优化工具:参数减少80%,精度几乎不变...
  13. 决策树案例:基于python的商品购买能力预测系统
  14. 【Luogu】【关卡2-3】排序(2017年10月) 【AK】
  15. (转)基于FPGA技术的FAST行情解码研究
  16. 【黑苹果】联想ThinkPad X1 Carbon 2016+i5 6200U+MacOS10.15.7 EFI文件下载
  17. 英语“就近原则”和“就远原则”
  18. 饥荒联机版你的服务器无响应,饥荒联机版为什么每次创建世界都会无响应 | 手游网游页游攻略大全...
  19. favi.icon是什么?
  20. 一般家用路由器买多大的合适_家用路由器选多少M(兆)的合适

热门文章

  1. 机器学习中较为简单的算法有哪些?
  2. 使用Visual Studio Code 第一次开发C# 运行Hello World!
  3. python 拆分pdf(有可执行文件exe)
  4. 鱼鱼Chen之学写自己的apk(二) 使用SlidingPaneLayout实现漂亮的布局
  5. 搭建私人网络硬盘、个人网盘,百度网盘——Seafile安装部署指南
  6. python 用PIL库缩放图片并保存
  7. 运维过程中需要记住的英语单词
  8. 基于kaldi的在线语音识别
  9. Pads-Layout 流程
  10. Python学习笔记(2):生成随机数