c++ 结构体遍历_二叉树(Binary Tree)的建立与遍历——C语言实现
![](/assets/blank.gif)
一、运行环境简介
编辑器: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;
}
复制代码
测试结果如下:
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
点击链接领取资料,先到先得:
点击链接:领取新手礼包,学习资料jq.qq.com
c++ 结构体遍历_二叉树(Binary Tree)的建立与遍历——C语言实现相关推荐
- c++ 结构体赋值_《零基础看得懂的C语言入门教程》—(十二)结构体是这么回事
一.学习目标 了解C语言的结构体的使用方法 了解C语言结构体的结构的赋值 了解多种C语言结构体变量的赋值方法和取值方法 目录 <零基础看得懂的C语言入门教程>--(二)简单带你了解流程 & ...
- java实现二叉树的后序遍历_二叉树前序中序后序遍历(Java实现)
基于对数组和链表的存储优缺点分析,这里按照需求引进了一种新的数据结构,树 它可以在增删改查上都保持高效率 创建如下图所示的二叉树,并分别使用三种顺序遍历: 代码实现: package Tree; pu ...
- 由任意二叉树的前序遍历序列和中序遍历序列求二叉树的思想方法_算法与数据结构基础 - 二叉树(Binary Tree)...
二叉树基础 满足这样性质的树称为二叉树:空树或节点最多有两个子树,称为左子树.右子树, 左右子树节点同样最多有两个子树. 二叉树是递归定义的,因而常用递归/DFS的思想处理二叉树相关问题,例如Leet ...
- 『数据结构与算法』解读树(Tree)和二叉树(Binary Tree)!
『数据结构与算法』解读树(Tree)和二叉树(Binary Tree)! 文章目录 一. 树 1.1. 树的定义 1.2. 树的基本术语 1.3. 树的性质 二. 二叉树 2.1. 二叉树的定义 2. ...
- 【数据结构】二叉树 (Binary Tree)
目录 一. 什么是树? 二. 二叉树 特殊二叉树 二叉树的性质 二叉树的存储 二叉树的遍历 二叉树的基本操作 一.什么是树? 之前咱们学习了一些简单的数据结构,如顺序表,链表,这些都是线性结构,线性结 ...
- 二叉树 Binary Tree
我怀着激动的心 走上了这颗树 今天是2021年11月12日 今天开始上树!!!!!! 生活中的树形结构: 树: 根节点: 一棵树有且只有一个根节点就是最上面的节点 兄弟节点: 每一行的节点 它们具 ...
- mysql如何二叉树遍历_二叉树遍历
二叉树的遍历方式分别为:前序遍历.中序遍历.后序遍历. 前序遍历: 先访问根节点,再访问左节点,最后访问右节点 中序遍历: 先访问左节点,再访问根节点,最后访问右节点 后序遍历: 先访问左节点,再访问 ...
- LeetCode 145. Binary Tree Postorder Traversal--后序遍历--先序遍历反向输出--递归,迭代--C++,Python解法
题目地址:Binary Tree Postorder Traversal - LeetCode Given a binary tree, return the postorder traversal ...
- 深度优先遍历_二叉树的深度优先遍历,理解框架真的能够套用题目吗?不了解执行过程可能很难。...
显然这是一个很普通的二叉树的深度优先遍历,从中可以提取出这样的框架: class TreeNode { int val; TreeNode left, right; } public void isF ...
最新文章
- MyBatis框架学习DAY_01:概念/创建运行流程
- Scrapy框架基础使用
- php引入路径配置,require.js的路径配置和css的引入方法详解
- 程序员,如何摆脱平庸?
- TranslateMessage ,GetMessage, DispatchMessage分析
- linux 火狐无法执行二进制文件_尝试在Linux上运行Shell脚本时“无法执行二进制文件”...
- pb65 xp 安装无反应_长春优质AFB型耐腐蚀泵安装
- 前端学习(1034):jquery插件-全屏滚动
- 云开发的数据库权限机制解读丨云开发101
- windows程序窗体创建流程模型A--发送自定义消息逻辑上出现Bug
- android 蓝牙连接obd,Android蓝牙连接汽车OBD设备
- tensorflow如何微调时如何只训练后两层_TensorFlow官方发布剪枝优化工具:参数减少80%,精度几乎不变...
- 决策树案例:基于python的商品购买能力预测系统
- 【Luogu】【关卡2-3】排序(2017年10月) 【AK】
- (转)基于FPGA技术的FAST行情解码研究
- 【黑苹果】联想ThinkPad X1 Carbon 2016+i5 6200U+MacOS10.15.7 EFI文件下载
- 英语“就近原则”和“就远原则”
- 饥荒联机版你的服务器无响应,饥荒联机版为什么每次创建世界都会无响应 | 手游网游页游攻略大全...
- favi.icon是什么?
- 一般家用路由器买多大的合适_家用路由器选多少M(兆)的合适