
二叉树的前中后序遍历
获取节点总数:首先需要知道二叉树中节点的总数。这可以通过递归遍历树节点,计算左右子树节点数再加1来实现。 创建存储数组:根据节点总数,创建一个足够大的数组来存储遍历结果。 递归填充数组:从根节点开始,按照前序方式依次填充数组,先填充根节点值,然后递归填充左子树,最后填充右子树。 获取节点总数:与前序相同,通过递归计算节点总数。 创建存储数组:同样创建一个足够大的数组。 递归填充数组:先递归填充左子树,接着填充根节点值,最后递归填充右子树。 获取节点总数:同样通过递归计算节点总数。 创建存储数组:创建一个足够大的数组。 递归填充数组:先递归填充左子树,再递归填充右子树,最后填充根节点值。
发布日期:2021-05-07 11:08:11
浏览次数:23
分类:精选文章
本文共 2392 字,大约阅读时间需要 7 分钟。
二叉树的前序、中序、后序遍历实现
给定二叉树的根节点 root,返回它的前序、中序、后序遍历结果。
前序遍历(Preorder Traversal)
前序遍历的特点是先访问根节点,再访问左子树,最后访问右子树。
实现步骤
代码示例
int GetSize(struct TreeNode* root) { if (root == NULL) return 0; return GetSize(root->left) + GetSize(root->right) + 1;}void Traversal(int* arr, struct TreeNode* root, int* count) { if (root != NULL) { arr[*count] = root->val; (*count)++; Traversal(arr, root->left, count); Traversal(arr, root->right, count); }}int* preorderTraversal(struct TreeNode* root, int* returnSize) { int size = GetSize(root); int* arr = (int*)malloc(sizeof(int) * size); int count = 0; Traversal(arr, root, &count); *returnSize = count; return arr;}
中序遍历(Inorder Traversal)
中序遍历的特点是先访问左子树,最后访问右子树,根节点值最后一个访问。
实现步骤
代码示例
int GetSize(struct TreeNode* root) { if (root == NULL) return 0; return GetSize(root->left) + GetSize(root->right) + 1;}void Traversal(int* arr, struct TreeNode* root, int* count) { if (root) { Traversal(arr, root->left, count); arr[(*count)++] = root->val; Traversal(arr, root->right, count); }}int* inorderTraversal(struct TreeNode* root, int* returnSize) { int size = GetSize(root); int* arr = (int*)malloc(sizeof(int) * size); int count = 0; Traversal(arr, root, &count); *returnSize = count; return arr;}
后序遍历(Postorder Traversal)
后序遍历的特点是先访问左子树和右子树,最后访问根节点。
实现步骤
代码示例
int GetSize(struct TreeNode* root) { if (root == NULL) return 0; return GetSize(root->left) + GetSize(root->right) + 1;}void Traversal(int* arr, struct TreeNode* root, int* count) { if (root) { Traversal(arr, root->left, count); Traversal(arr, root->right, count); arr[(*count)++] = root->val; }}int* postorderTraversal(struct TreeNode* root, int* returnSize) { int size = GetSize(root); int* arr = (int*)malloc(sizeof(int) * size); int count = 0; Traversal(arr, root, &count); *returnSize = count; return arr;}
总结
这三种遍历方法虽然实现方式不同,但核心思想都是通过递归的方式遍历树节点,区别仅在于访问顺序的不同。通过合理设计递归函数和存储数组,可以轻松实现任意顺序的遍历。
发表评论
最新留言
感谢大佬
[***.8.128.20]2025年04月24日 00时13分45秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Kubernetes学习总结(18)—— Kubernetes 容器网络
2025-04-03
Kubernetes学习总结(5)——Kubernetes 常见面试题汇总
2025-04-03
Kubernetes实战(三十一)-Calico网络部署(推荐)
2025-04-03
Kubernetes实战(三十三)-外部Etcd集群部署与调优(更安全的数据存储策略)
2025-04-03
Kubernetes快速上手:部署、使用及核心概念解析
2025-04-03
lamp 一键安装
2025-04-04
laravel 之 Eloquent 模型修改器和序列化
2025-04-04
Laravel项目宝塔部署全攻略:从0到1的实战指南
2025-04-04
laravl 文件存储云存储
2025-04-04
LaTeX伪代码编辑
2025-04-04
Latex相关文章
2025-04-04
leaflet删除所有图层(leaflet篇.25)
2025-04-04
leaflet叠加geojson图层(leaflet篇.38)
2025-04-04
leaflet面采集与面编辑(leaflet篇.7)
2025-04-04
Leedcode3- Max Points on a Line 共线点个数
2025-04-04
LeetCode OJ:Merge k Sorted Lists(归并k个链表)
2025-04-05
LeetCode Text Justification
2025-04-05
Leetcode | Simplify Path
2025-04-05