LeetCode刷题指南
第 0 章 hot100
0.1 哈希
0.2 双指针
0.3 滑动窗口
0.4 子串
0.5 普通数组
0.6 矩阵
0.7 链表
0.8 二叉树
0.9 图论
0.10 回溯
0.11 二分查找
0.12 栈
0.13 堆
0.14 贪心算法
0.15 动态规划
0.16 多维动态规划
0.17 技巧
第0-1章 面试经典150
0.1 数组/字符串
0.2 双指针
0.3 滑动窗口
链表
二叉树
第 1 章 最易懂的贪心算法
1.1 算法解释
1.2 分配问题
1.3 区间问题
1.4 练习
第 2 章 玩转双指针
2.1 算法解释
2.2 Two Sum
2.3 归并两个有序数组
2.4 滑动窗口
2.5 快慢指针
2.6 练习
第 3 章 居合斩!二分查找
3.1 算法解释
3.2 求开方
3.3 查找区间
3.4 查找峰值
3.5 旋转数组查找数字
3.6 练习
第 4 章 千奇百怪的排序算法
4.1 常用排序算法
4.2 快速选择
4.3 桶排序
4.4 练习
第 5 章 一切皆可搜索
5.1 算法解释
5.2 深度优先搜索
5.3 回溯法
5.4 广度优先搜索
5.5 练习
第 6 章 深入浅出动态规划
6.1 算法解释
6.2 基本动态规划:一维
6.3 基本动态规划:二维
6.4 分割类型题
6.5 子序列问题
6.6 背包问题
6.7 字符串编辑
6.8 股票交易
6.9 练习
第 7 章 化繁为简的分治法
7.1 算法解释
7.2 表达式问题
7.3 练习
第 8 章 巧解数学问题
8.1 引言
8.2 公倍数与公因数
8.3 质数
8.4 数字处理
8.5 随机与取样
8.6 练习
第 9 章 神奇的位运算
9.1 常用技巧
9.2 位运算基础问题
9.3 二进制特性
9.4 练习
第 10 章 妙用数据结构
10.1 C++ STL
10.2 Python 常用数据结构
10.3 数组
10.4 栈和队列
10.5 单调栈
10.6 优先队列
10.7 双端队列
10.8 哈希表
10.9 多重集合和映射
10.10 前缀和与积分图
10.11 练习
第 11 章 令人头大的字符串
11.1 引言
11.2 字符串比较
11.3 字符串理解
11.4 字符串匹配
11.5 练习
第 12 章 指针三剑客之一:链表
12.1 数据结构介绍
12.2 链表的基本操作
12.3 其它链表技巧
12.4 练习
第 13 章 指针三剑客之二:树
13.1 数据结构介绍
13.2 树的递归
13.3 层次遍历
13.4 前中后序遍历
13.5 二叉查找树
13.6 字典树
13.7 练习
第 14 章 指针三剑客之三:图
14.1 数据结构介绍
14.2 二分图
14.3 拓扑排序
14.4 练习
第 15 章 更加复杂的数据结构
15.1 引言
15.2 并查集
15.3 复合数据结构
15.4 练习
第16章 面试题
第 17 章 十大经典排序算法
README
本文档使用 MrDoc 发布
-
+
首页
13.4 前中后序遍历
# 13.4 前中后序遍历 前序遍历、中序遍历和后序遍历是三种利用深度优先搜索遍历二叉树的方式。它们是在对节点访问的顺序有一点不同,其它完全相同。考虑如下一棵树, ``` 1 / \ 2 3 / \ \ 4 5 6 ``` 前序遍历先遍历父结点,再遍历左结点,最后遍历右节点,我们得到的遍历顺序是 [1 2 4 5 3 6]。 ```py def preorder(root: TreeNode): visit(root) preorder(root.left) preorder(root.right) ``` 中序遍历先遍历左节点,再遍历父结点,最后遍历右节点,我们得到的遍历顺序是 [4 2 5 1 3 6]。 ```py def inorder(root: TreeNode): inorder(root.left) visit(root) inorder(root.right) ``` 后序遍历先遍历左节点,再遍历右结点,最后遍历父节点,我们得到的遍历顺序是 [4 5 2 6 3 1]。 ```py def postorder(root: TreeNode): postorder(root.left) postorder(root.right) visit(root) ``` ## [105. Construct Binary Tree from Preorder and Inorder Traversal](https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/) ### 题目描述 给定一个二叉树的前序遍历和中序遍历结果,尝试复原这个树。已知树里不存在重复值的节点。 ### 输入输出样例 输入是两个一维数组,分别表示树的前序遍历和中序遍历结果;输出是一个二叉树。 ``` Input: preorder = [4,9,20,15,7], inorder = [9,4,15,20,7] Output: 4 / \ 9 20 / \ 15 7 ``` ### 题解 我们通过本题的样例讲解一下本题的思路。前序遍历的第一个节点是 4,意味着 4 是根节点。我们在中序遍历结果里找到 4 这个节点,根据中序遍历的性质可以得出,4 在中序遍历数组位置的左子数组为左子树,节点数为 1,对应的是前序排列数组里 4 之后的 1 个数字(9);4 在中序遍历数组位置的右子数组为右子树,节点数为 3,对应的是前序排列数组里最后的 3 个数字。有了这些信息,我们就可以对左子树和右子树进行递归复原了。为了方便查找数字的位置,我们可以用哈希表预处理中序遍历的结果。 ```py class Solution: def reconstruct(self, io_map, po, l, r, mid_po): if l > r: return None mid_val = po[mid_po] mid_io = io_map[mid_val] left_len = mid_io - l node = TreeNode(mid_val) node.left = self.reconstruct(io_map, po, l, mid_io - 1, mid_po + 1) node.right = self.reconstruct(io_map, po, mid_io + 1, r, mid_po + left_len + 1) return node def buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]: io_map = {val: i for i, val in enumerate(inorder)} return self.reconstruct(io_map, preorder, 0, len(preorder) - 1, 0) ``` ## [144. Binary Tree Preorder Traversal](https://leetcode.com/problems/binary-tree-preorder-traversal/) ### 题目描述 不使用递归,实现二叉树的前序遍历。 ### 输入输出样例 输入一个二叉树,输出一个数组,为二叉树前序遍历的结果, ``` Input: 1 \ 2 / 3 Output: [1,2,3] ``` ### 题解 因为递归的本质是栈调用,因此我们可以通过栈来实现前序遍历。注意入栈的顺序。 递归解法 ```py class Solution: def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]: res = [] def helper(root): if not root: return res.append(root.val) helper(root.left) helper(root.right) helper(root) return res ``` 非递归解法 ```py class Solution: def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]: res = [] if not root: return res s = [root] while s: node = s.pop() res.append(node.val) if node.right: s.append(node.right) if node.left: s.append(node.left) return res ```
嘉心糖糖
2025年3月12日 17:08
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码