当前位置: 首页 > news >正文

二叉树链式结构的前序_中序_后续_层序遍历【详细图解】

P. S.:以下代码均在VS2019环境下测试,不代表所有编译器均可通过。
P. S.:测试代码均未展示头文件stdio.h的声明,使用时请自行添加。

  

在这里插入图片描述

                                           博主主页:LiUEEEEE
                                              C语言专栏
                                            数据结构专栏
                                         力扣牛客经典题目专栏

目录

  • 1、前言
  • 2、前序遍历
  • 3、中序遍历
  • 4、后序遍历
  • 5、层序遍历
  • 6、完整代码展示
  • 7、结语

1、前言


  有关二叉树链式结构的四种遍历方式,是基于二叉树由链式结构组成,故本文不再讲解如何实现二叉树的链式结构,以手搓链式结构的方式进行四种遍历方式的讲解。
  • 结点结构及相关定义展示:
typedef int TreeDataType;typedef struct TreeNode
{TreeDataType val;struct TreeNode* left;struct TreeNode* right;
}TNode;TNode* BuyNode(TreeDataType x);创建二叉树结点TNode* CreateTree();串连结点组成树
  • BuyNode
TNode* BuyNode(TreeDataType x)
{TNode* tmp = (TNode*)malloc(sizeof(TNode));if (tmp == NULL){perror("BuyNode: malloc fail");return NULL;}tmp->val = x;tmp->left = tmp->right = NULL;return tmp;
}
  • CreateTree
TNode* CreateTree()
{TNode* node1 = BuyNode(1);TNode* node2 = BuyNode(2);TNode* node3 = BuyNode(3);TNode* node4 = BuyNode(4);TNode* node5 = BuyNode(5);TNode* node6 = BuyNode(6);node1->left = node2;node1->right = node3;node2->left = node4;node2->right = node5;node3->left = node6;return node1;
}

  再此基础上我们所构建的书逻辑图如下所示:
在这里插入图片描述
PS.图中子树未连接部分均为NULL。




2、前序遍历


  遍历的命名规则为,以每一颗树的根为主要节点(整个树的根以及子树的根),以根出现的次序进行命名,下文中的中序后续皆可以此理解。
  前序遍历:遍历的顺序依次为:根,左子树,右子树。
  例如上文中我们手搓的二叉树,通过前序遍历的过程并打印的结果如下图所示:

在这里插入图片描述

  • 前序遍历代码实现
void PreOrder(TNode* root)
{if (root == NULL)return;printf("%d ", root->val);PreOrder(root->left);PreOrder(root->right);
}




3、中序遍历


  中序遍历:遍历的顺序依次为:左子树,根,右子树。
  例如上文中我们手搓的二叉树,通过中序遍历的过程并打印的结果如下图所示:

在这里插入图片描述

  • 中序遍历代码实现
void InOrder(TNode* root)
{if (root == NULL)return;InOrder(root->left);printf("%d ", root->val);InOrder(root->right);
}




4、后序遍历


  后序遍历:遍历的顺序依次为:左子树,右子树,根。
  例如上文中我们手搓的二叉树,通过后序遍历的过程并打印的结果如下图所示:

在这里插入图片描述

  • 后序遍历代码实现
void PostOrder(TNode* root)
{if (root == NULL)return;PostOrder(root->left);PostOrder(root->right);printf("%d ", root->val);
}




5、层序遍历


  层序遍历是指按照层数从每层的最左侧向右依次打印二叉树的节点值,如下图所示:

在这里插入图片描述


  但我们实际中很难使用递归来操作,使得再打印完2时,通过结点1找到结点3的值打印,故我们需要借助其他工具进行实现,即队列。


  操作原则是,先将根结点1输入到队列中,在打印根结点1时,将结点1的左结点与右结点依次输入进队列,并将结点1从队列中删除,以此往复,直至在队列中遇见空结点。
  对此本文不再对队列相关的知识进行讲解,如有需要回看博文:

                     队列的实现(使用链表)


  逻辑思路如下图所示:

在这里插入图片描述

  • 层序遍历代码实现
void LevelOrder(TNode* root)
{Queue pq;QueueInit(&pq);if (root)QueuePush(&pq, root);while (!QueueEmpty(&pq)){TNode* front = QueueFront(&pq);QueuePop(&pq);printf("%d ", front->val);if (front->left)QueuePush(&pq, front->left);if (front->right)QueuePush(&pq, front->right);}QueueDestroy(&pq);
}
  • 四种遍历方式结果展示
    在这里插入图片描述




6、完整代码展示


   P,S.本章节所展示代码不包含队列代码,如有需求请自行添加。
  • Tree.h
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>typedef int TreeDataType;typedef struct TreeNode
{TreeDataType val;struct TreeNode* left;struct TreeNode* right;
}TNode;TNode* BuyNode(TreeDataType x);TNode* CreateTree();void PreOrder(TNode* root);void InOrder(TNode* root);void PostOrder(TNode* root);void LevelOrder(TNode* root);
  • Tree.c
#include "Tree.h"
#include "Queue.h"TNode* BuyNode(TreeDataType x)
{TNode* tmp = (TNode*)malloc(sizeof(TNode));if (tmp == NULL){perror("BuyNode: malloc fail");return NULL;}tmp->val = x;tmp->left = tmp->right = NULL;return tmp;
}TNode* CreateTree()
{TNode* node1 = BuyNode(1);TNode* node2 = BuyNode(2);TNode* node3 = BuyNode(3);TNode* node4 = BuyNode(4);TNode* node5 = BuyNode(5);TNode* node6 = BuyNode(6);node1->left = node2;node1->right = node3;node2->left = node4;node2->right = node5;node3->left = node6;return node1;
}void PreOrder(TNode* root)
{if (root == NULL)return;printf("%d ", root->val);PreOrder(root->left);PreOrder(root->right);
}void InOrder(TNode* root)
{if (root == NULL)return;InOrder(root->left);printf("%d ", root->val);InOrder(root->right);
}void PostOrder(TNode* root)
{if (root == NULL)return;PostOrder(root->left);PostOrder(root->right);printf("%d ", root->val);
}void LevelOrder(TNode* root)
{Queue pq;QueueInit(&pq);if (root)QueuePush(&pq, root);while (!QueueEmpty(&pq)){TNode* front = QueueFront(&pq);QueuePop(&pq);printf("%d ", front->val);if (front->left)QueuePush(&pq, front->left);if (front->right)QueuePush(&pq, front->right);}QueueDestroy(&pq);
}
  • TreeTest.c
#include "Tree.h"void test()
{TNode* root = CreateTree();printf("前序遍历结果:");PreOrder(root);printf("\n");printf("中序遍历结果:");InOrder(root);printf("\n");printf("后序遍历结果:");PostOrder(root);printf("\n");printf("层序遍历结果:");LevelOrder(root);printf("\n");
}int main()
{test();return 0;
}




7、结语


在这里插入图片描述

  十分感谢您观看我的原创文章。
  本文主要用于个人学习和知识分享,学习路漫漫,如有错误,感谢指正。
  如需引用,注明地址。

相关文章:

  • leetCode-hot100-数组专题之子数组+二维数组
  • SSD图、用例描述
  • React Native 之 ToastAndroid(提示语)(二十一)
  • I2C协议详解
  • 日志输出-第四章-接口级(单体应用)前后端数据加解密 Filter 实现
  • 设计模式 17 组合模式 Composite Pattern
  • 网页设计步骤总结
  • C++ Qt:QString与数字之间的相互转换
  • es和mongdb对比
  • Ai速递5.29
  • 0.25W 1.5KVDC~3KVDC 隔离超小型单输出 DC/DC 电源模块——TKE-W25系列
  • 重磅发布,2024精选《制造业商业智能BI最佳实践合集 》
  • 电量计量芯片HLW8110的前端电路设计与误差分析校正.pdf 下载
  • 一个程序员的牢狱生涯(44)询问
  • MOS管开关电路简单笔记
  • 2019.2.20 c++ 知识梳理
  • 77. Combinations
  • CSS中外联样式表代表的含义
  • Java 内存分配及垃圾回收机制初探
  • Java程序员幽默爆笑锦集
  • Map集合、散列表、红黑树介绍
  • ng6--错误信息小结(持续更新)
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • storm drpc实例
  • use Google search engine
  • 阿里研究院入选中国企业智库系统影响力榜
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 计算机常识 - 收藏集 - 掘金
  • 记一次删除Git记录中的大文件的过程
  • 十年未变!安全,谁之责?(下)
  • 事件委托的小应用
  • 算法---两个栈实现一个队列
  • 小程序 setData 学问多
  • 怎样选择前端框架
  • ionic异常记录
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 如何正确理解,内页权重高于首页?
  • ​14:00面试,14:06就出来了,问的问题有点变态。。。
  • ​Redis 实现计数器和限速器的
  • # Redis 入门到精通(八)-- 服务器配置-redis.conf配置与高级数据类型
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (rabbitmq的高级特性)消息可靠性
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (二十九)STL map容器(映射)与STL pair容器(值对)
  • (微服务实战)预付卡平台支付交易系统卡充值业务流程设计
  • (一)Docker基本介绍
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .jks文件(JAVA KeyStore)
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET gRPC 和RESTful简单对比
  • .NET 通过系统影子账户实现权限维持
  • .NetCore+vue3上传图片 Multipart body length limit 16384 exceeded.