五分钟C语言数据结构 之 二叉树中序遍历
时间:2022-07-24
本文章向大家介绍五分钟C语言数据结构 之 二叉树中序遍历,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
五分钟C语言实现常见数据结构 之 二叉树中序遍历
五分钟C语言实现常见数据结构
今天的内容分享的是二叉树中序遍历
二叉树中序遍历
二叉树的遍历方式主要由先序遍历、中序遍历和后续遍历,然后就是层次遍历
感受完上篇文章的先序遍历,本节来看看中序遍历
中序遍历过程
a. 先序遍历其左子树;
b. 访问根节点;
c. 先序遍历其右子树;
然后就是一直递归下去,在访问到节点的时候,可以进行节点的相关处理,比如说简单的访问节点值
下图是一棵二叉树,我们来手动模拟一下中序遍历过程
按照上述中序遍历的过程,得到中序遍历序列:
H D I B E A F C G
递归实现
二叉树的中序遍历利用上述的递归思想进行C语言代码实现:
树形结构按照上述树形结构进行初始化
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
# define ElementType char
//结点结构体
typedef struct BinTNode{
ElementType data;
struct BinTNode * left;
struct BinTNode * right;
}BinTNode, *BinTree;
// 初始化树形结构
BinTNode * CreateBiTree(BinTNode *T){
T=(BinTNode*)malloc(sizeof(BinTNode));
T->data='A';
T->left=(BinTNode*)malloc(sizeof(BinTNode));
T->left->data='B';
T->right=(BinTNode*)malloc(sizeof(BinTNode));
T->right->data='C';
T->left->left=(BinTNode*)malloc(sizeof(BinTNode));
T->left->left->data='D';
T->left->right=(BinTNode*)malloc(sizeof(BinTNode));
T->left->right->data='E';
T->left->right->left=NULL;
T->left->right->right=NULL;
T->left->left->left=(BinTNode*)malloc(sizeof(BinTNode));
T->left->left->left->data='H';
T->left->left->left->left=NULL;
T->left->left->left->right=NULL;
T->left->left->right=(BinTNode*)malloc(sizeof(BinTNode));
T->left->left->right->data='I';
T->left->left->right->left=NULL;
T->left->left->right->right=NULL;
T->right->left=(BinTNode*)malloc(sizeof(BinTNode));
T->right->left->data='F';
T->right->left->left=NULL;
T->right->left->right=NULL;
T->right->right=(BinTNode*)malloc(sizeof(BinTNode));
T->right->right->data='G';
T->right->right->left=NULL;
T->right->right->right=NULL;
return T;
}
// 遍历过程中,输出节点值
void printElement(BinTNode * T){
printf("%c ",T->data);
}
//中序遍历
void InOrderTraverse(BinTNode * T){
if (T) {
InOrderTraverse(T->left); //递归访问左孩子
printElement(T); //输出节点值
InOrderTraverse(T->right); //递归访问右孩子
}
// 当节点为空的时候,返回
return;
}
int main() {
BinTNode * Tree;
Tree = CreateBiTree(Tree); // 初始化树形结构
printf("中序遍历: ");
InOrderTraverse(Tree); // 先序递归进行
printf("n"); // 最后换行
return 0;
}
运行结果:
中序遍历: H D I B E A F C G
非递归实现
参照先序遍历非递归,由于在遍历过程中需要保存中间值,将符合遍历的节点优先输出
所以,同样非递归的基本思路:使用堆栈
- 当遍历到一个结点时,就压栈,然后继续去遍历它的左子树;
- 当左子树遍历完成后,从栈顶弹出栈顶元素(左子树最后一个元素)并访问它;
- 最后按照当前指正的右孩子继续中序遍历,若没有右孩子,继续弹出栈顶元素。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define ElementType char
int top = -1; //定义top栈顶元素下标
// 结点结构体
typedef struct BinTNode{
ElementType data;
struct BinTNode * left;
struct BinTNode * right;
}BinTNode, *BinTree;
// 初始化树形结构
BinTNode * CreateBiTree(BinTNode *T) {
T=(BinTNode*)malloc(sizeof(BinTNode));
T->data='A';
T->left=(BinTNode*)malloc(sizeof(BinTNode));
T->left->data='B';
T->right=(BinTNode*)malloc(sizeof(BinTNode));
T->right->data='C';
T->left->left=(BinTNode*)malloc(sizeof(BinTNode));
T->left->left->data='D';
T->left->right=(BinTNode*)malloc(sizeof(BinTNode));
T->left->right->data='E';
T->left->right->left=NULL;
T->left->right->right=NULL;
T->left->left->left=(BinTNode*)malloc(sizeof(BinTNode));
T->left->left->left->data='H';
T->left->left->left->left=NULL;
T->left->left->left->right=NULL;
T->left->left->right=(BinTNode*)malloc(sizeof(BinTNode));
T->left->left->right->data='I';
T->left->left->right->left=NULL;
T->left->left->right->right=NULL;
T->right->left=(BinTNode*)malloc(sizeof(BinTNode));
T->right->left->data='F';
T->right->left->left=NULL;
T->right->left->right=NULL;
T->right->right=(BinTNode*)malloc(sizeof(BinTNode));
T->right->right->data='G';
T->right->right->left=NULL;
T->right->right->right=NULL;
return T;
}
// 栈 - 进栈push
void push(BinTNode** stack,BinTNode * elem) {
stack[++top] = elem;
}
//栈 - 弹栈pop
void pop(){
if (top == -1) {
return ;
}
top--;
}
// 遍历过程中,输出结点值
void printElement(BinTNode* elem) {
printf("%c ",elem->data);
}
//获取栈顶元素
BinTNode* getTop(BinTNode** stack){
return stack[top];
}
//非递归遍历 - 左根右
void InOrderTraverse(BinTNode * Tree) {
BinTNode * stack[20]; // 定义一个栈
BinTNode * p = Tree; // 定义临时指针
// 1 当前指针指向不为NULL - 说明有右孩子
// 2 或者栈内不空 - 说明该指针处没有右孩子,继续弹出结点值
while (p || top!=-1) {
while (p){
push(stack, p); // 循环将左孩子进栈
p = p->left;
}
if (top!=-1) {
p=getTop(stack); //取栈顶元素
pop(); //栈顶元素弹栈
printElement(p);
p = p->right;
}
}
}
int main() {
BinTNode * Tree;
Tree = CreateBiTree(Tree);
printf("看到这样就对了: H D I B E A F C Gn");
printf("中序遍历:t");
InOrderTraverse(Tree);
printf("n");
return 0;
}
运行结果
看到这样就对了: H D I B E A F C G
中序遍历: H D I B E A F C G
后续会将更多的数据结构用C语言代码实现,欢迎大家关注!
作者:Johngo
图片:凡科快图
- WSP Global品牌升级 启用3声母域名
- 一、爬虫基本原理
- python 中__setattr__, __getattr__,__getattribute__, __call__使用方法
- 量子技术与人工智能:同时进化的双生子
- TCP协议三次握手与四次挥手通俗解析
- Silverlight/aspx/ajax/mvc的UI自动化测试
- Office Open XML学习(1)-创建excel文档,并向单元格中插入字符串
- PyMC3和Theano代码构建贝叶斯深度网络,61页PPT探索贝叶斯深度学习以及实现
- 男程序员是不是都不会和女生表达交流?程序员的回答歪了
- Silverlight Telerik控件学习:主题Theme切换
- Silverlight自定义类库实现应用程序缓存
- Silverlight Telerik控件学习:TreeView数据绑定并初始化选中状态、PanelBar的Accordion效果、TabPanel、Frame基本使用
- 这或许是对小白最友好的python入门了吧——4,列表
- 每个人都应该知道的十个机器学习常识
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android编程实现扭曲图像的绘制功能示例
- 直播带货APP开发,圆形旋转动画
- 显存优化:纹理压缩功能介绍与使用说明
- Android编程简易实现XML解析的方法详解
- Android中SeekBar拖动条控件使用方法详解
- Android编程简单解析JSON格式数据的方法示例
- Android控件BottomSheet实现底边弹出选择列表
- Android中CheckBox复选框控件使用方法详解
- Android Recyclerview实现水平分页GridView效果示例
- Android编程之ListView和EditText发布帖子隐藏软键盘功能详解
- 建造者模式_动力节点Java学院整理
- Android ScrollView嵌套横向滑动控件时冲突问题
- Android用户输入自动提示控件AutoCompleteTextView使用方法
- Android自定义View实现水波纹效果
- Android如何获取系统通知的开启状态详解