news 2026/8/6 2:49:22

二叉树前中后序遍历

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
二叉树前中后序遍历

二叉树前中后序遍历 - 代码实现思路与图解

1. 项目概述

本项目实现了二叉树的三种遍历方式:前序遍历中序遍历后序遍历,均采用递归实现。

2. 数据结构定义

2.1 二叉树节点结构

typedefcharBTDataType;typedefstructBinaryTreeNode{structBinaryTreeNode*left;// 指向左孩子的指针structBinaryTreeNode*right;// 指向右孩子的指针BTDataType data;// 数据元素}BTNode;

结构说明:

  • data:存储节点数据(字符类型)
  • left:指向左子节点的指针
  • right:指向右子节点的指针

3. 二叉树构建过程

3.1 手动构造二叉树

BTNode*CreateTree(){BTNode*nodea=BuyBTNode('a');BTNode*nodeb=BuyBTNode('b');BTNode*nodec=BuyBTNode('c');BTNode*noded=BuyBTNode('d');BTNode*nodee=BuyBTNode('e');BTNode*nodef=BuyBTNode('f');nodea->left=nodeb;nodea->right=nodec;nodeb->left=noded;nodeb->right=nodee;nodec->right=nodef;returnnodea;}

3.2 构造的二叉树结构

a / \ b c / \ \ d e f

4. 遍历实现思路

4.1 前序遍历(Pre-order Traversal)

访问顺序:根节点 → 左子树 → 右子树

voidPreorder(BTNode*root){if(root==NULL){printf("NULL ");return;}printf("%c ",root->data);// 1. 访问根节点Preorder(root->left);// 2. 递归遍历左子树Preorder(root->right);// 3. 递归遍历右子树}

前序遍历结果:a b d e c f

4.2 中序遍历(In-order Traversal)

访问顺序:左子树 → 根节点 → 右子树

voidInorder(BTNode*root){if(root==NULL){printf("NULL ");return;}Inorder(root->left);// 1. 递归遍历左子树printf("%c ",root->data);// 2. 访问根节点Inorder(root->right);// 3. 递归遍历右子树}

中序遍历结果:d b e a c f

4.3 后序遍历(Post-order Traversal)

访问顺序:左子树 → 右子树 → 根节点

voidPostorder(BTNode*root){if(root==NULL){printf("NULL ");return;}Postorder(root->left);// 1. 递归遍历左子树Postorder(root->right);// 2. 递归遍历右子树printf("%c ",root->data);// 3. 访问根节点}

后序遍历结果:d e b f c a

5. 递归执行过程图解

5.1 前序遍历递归展开图

Preorder(a) ├── printf("a ") // 访问根节点a ├── Preorder(b) │ ├── printf("b ") // 访问节点b │ ├── Preorder(d) │ │ ├── printf("d ") // 访问叶子节点d │ │ ├── Preorder(NULL) → 打印NULL并返回 │ │ └── Preorder(NULL) → 打印NULL并返回 │ └── Preorder(e) │ ├── printf("e ") // 访问叶子节点e │ ├── Preorder(NULL) → 打印NULL并返回 │ └── Preorder(NULL) → 打印NULL并返回 └── Preorder(c) ├── printf("c ") // 访问节点c ├── Preorder(NULL) → 打印NULL并返回 └── Preorder(f) ├── printf("f ") // 访问叶子节点f ├── Preorder(NULL) → 打印NULL并返回 └── Preorder(NULL) → 打印NULL并返回

输出结果:a b d NULL NULL e NULL NULL c NULL f NULL NULL

5.2 中序遍历递归展开图

Inorder(a) ├── Inorder(b) │ ├── Inorder(d) │ │ ├── Inorder(NULL) → 打印NULL并返回 │ │ ├── printf("d ") // 访问叶子节点d │ │ └── Inorder(NULL) → 打印NULL并返回 │ ├── printf("b ") // 访问节点b │ └── Inorder(e) │ ├── Inorder(NULL) → 打印NULL并返回 │ ├── printf("e ") // 访问叶子节点e │ └── Inorder(NULL) → 打印NULL并返回 ├── printf("a ") // 访问根节点a └── Inorder(c) ├── Inorder(NULL) → 打印NULL并返回 ├── printf("c ") // 访问节点c └── Inorder(f) ├── Inorder(NULL) → 打印NULL并返回 ├── printf("f ") // 访问叶子节点f └── Inorder(NULL) → 打印NULL并返回

输出结果:NULL d NULL b NULL e NULL a NULL c NULL f NULL

5.3 后序遍历递归展开图

Postorder(a) ├── Postorder(b) │ ├── Postorder(d) │ │ ├── Postorder(NULL) → 打印NULL并返回 │ │ ├── Postorder(NULL) → 打印NULL并返回 │ │ └── printf("d ") // 访问叶子节点d │ ├── Postorder(e) │ │ ├── Postorder(NULL) → 打印NULL并返回 │ │ ├── Postorder(NULL) → 打印NULL并返回 │ │ └── printf("e ") // 访问叶子节点e │ └── printf("b ") // 访问节点b ├── Postorder(c) │ ├── Postorder(NULL) → 打印NULL并返回 │ ├── Postorder(f) │ │ ├── Postorder(NULL) → 打印NULL并返回 │ │ ├── Postorder(NULL) → 打印NULL并返回 │ │ └── printf("f ") // 访问叶子节点f │ └── printf("c ") // 访问节点c └── printf("a ") // 访问根节点a

输出结果:NULL NULL d NULL NULL e b NULL NULL f c a

6. 核心要点总结

6.1 递归三要素

  1. 递归终止条件:节点为空时停止
  2. 当前层操作:打印节点数据
  3. 递归调用:分别调用左子树和右子树的遍历函数

6.2 三种遍历的区别

遍历方式访问顺序输出结果
前序遍历根→左→右a b d e c f
中序遍历左→根→右d b e a c f
后序遍历左→右→根d e b f c a

6.3 时间复杂度分析

  • 时间复杂度:O(n),每个节点恰好被访问一次
  • 空间复杂度:O(h),递归栈的深度,h为树的高度

7. 代码优化建议

  1. 去掉NULL打印:实际应用中通常不需要打印NULL
  2. 非递归实现:使用栈模拟递归过程
  3. 层序遍历:使用队列实现广度优先遍历

文档说明:本文档基于代码实现,详细解释了二叉树三种遍历方式的递归思路和执行过程。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/6 2:45:33

物理乒乓(Pong 风格

「赛博原力:物理乒乓(Pong 风格 / 刚体线圆碰撞、摩擦力矩赋予与智能轨迹拦截)」。这次我们将攻克 2D 对抗游戏中最核心的物理技术——「线段与圆形动态刚性碰撞计算(Line-Circle Intersection)、挡板移动…

作者头像 李华
网站建设 2026/8/6 2:44:36

Unity网格平滑与优化插件:从硬边到光滑的工程实践

1. 项目概述:为什么我们需要一个网格平滑与优化插件?在Unity开发中,尤其是涉及美术资源导入和优化的环节,我们经常会遇到一个经典的两难问题:性能与视觉质量的权衡。美术同学从3ds Max、Blender或Maya中导出的模型&…

作者头像 李华
网站建设 2026/8/6 2:44:32

物理台球(8 Ball Pool 风格

「赛博原力:物理台球(8 Ball Pool 风格 / 刚体球球对心碰撞、白球母球击打与轨道微擦同化)」。前面我们写过了旋转多米诺、矩形叠叠乐和刚体连缀蛇,这次我们将攻克 2D 物理游戏中最优雅且极具技术含量的硬核技术——「…

作者头像 李华
网站建设 2026/8/6 2:43:14

Bifrost:三星设备固件下载与管理的终极跨平台解决方案

Bifrost:三星设备固件下载与管理的终极跨平台解决方案 【免费下载链接】Bifrost Cross-platform tool for downloading Samsung mobile device firmware. 项目地址: https://gitcode.com/gh_mirrors/sa/Bifrost 在三星设备用户和技术爱好者的世界里&#xff…

作者头像 李华
网站建设 2026/8/6 2:43:10

Chromium内核指纹浏览器防关联技术深度解析

1. 指纹浏览器技术演进与行业现状指纹浏览器作为近年来快速发展的隐私保护工具,其核心价值在于解决用户在多账号管理、数据采集等场景下的身份隔离需求。传统浏览器会通过Canvas渲染、WebGL指纹、字体列表等数百个参数生成用户唯一标识,而专业指纹浏览器…

作者头像 李华
网站建设 2026/8/6 2:42:11

SpringBoot集成Quartz:从基础配置到集群部署的完整实践指南

1. 项目缘起:为什么是 Quartz?在任何一个稍具规模的业务系统中,定时任务都是一个绕不开的组件。从凌晨的数据报表生成、定期的缓存刷新,到复杂的订单状态轮询、消息重试补偿,定时任务就像系统里的“隐形闹钟”&#xf…

作者头像 李华