返回
以最简单的方式理解后序遍历与中序遍历:破解 LeetCode 106
前端
2023-10-08 13:32:41
目录
- 后序遍历与中序遍历简介
- 从后序遍历和中序遍历构建二叉树
- 寻找根节点
- 递归构建子树
- Python 代码实现
- 时间复杂度与空间复杂度分析
- 结语
后序遍历与中序遍历简介
后序遍历是指以如下顺序访问二叉树的节点:左子树、右子树、根节点。中序遍历是指以如下顺序访问二叉树的节点:左子树、根节点、右子树。
从后序遍历和中序遍历构建二叉树
我们从后序遍历序列的最后一个元素开始,作为二叉树的根节点。然后,我们在中序遍历序列中找到根节点,并将中序遍历序列划分为两部分:左子树的中序遍历序列和右子树的中序遍历序列。最后,我们分别使用后序遍历序列和划分的左子树、右子树的中序遍历序列递归地构建二叉树的左子树和右子树。
寻找根节点
后序遍历序列的最后一个元素是二叉树的根节点。
递归构建子树
- 在中序遍历序列中找到根节点。
- 将中序遍历序列划分为两部分:左子树的中序遍历序列和右子树的中序遍历序列。
- 使用后序遍历序列和划分的左子树、右子树的中序遍历序列递归地构建二叉树的左子树和右子树。
Python 代码实现
def build_tree(inorder, postorder):
"""
从后序遍历和中序遍历序列构建二叉树。
:param inorder: 中序遍历序列
:param postorder: 后序遍历序列
:return: 二叉树的根节点
"""
# 递归终止条件:后序遍历序列为空
if not postorder:
return None
# 后序遍历序列的最后一个元素是二叉树的根节点
root = TreeNode(postorder[-1])
# 在中序遍历序列中找到根节点
index = inorder.index(root.val)
# 将中序遍历序列划分为两部分:左子树的中序遍历序列和右子树的中序遍历序列
left_inorder = inorder[:index]
right_inorder = inorder[index + 1:]
# 将后序遍历序列划分为两部分:左子树的后序遍历序列和右子树的后序遍历序列
left_postorder = postorder[:index]
right_postorder = postorder[index:-1]
# 使用后序遍历序列和划分的左子树、右子树的中序遍历序列递归地构建二叉树的左子树和右子树
root.left = build_tree(left_inorder, left_postorder)
root.right = build_tree(right_inorder, right_postorder)
# 返回二叉树的根节点
return root
时间复杂度与空间复杂度分析
- 时间复杂度:O(n^2),其中 n 为二叉树的节点数。
- 空间复杂度:O(n),其中 n 为二叉树的节点数。
结语
本文通过清晰的讲解和直观的示例,为大家介绍了如何从后序遍历和中序遍历序列构建二叉树。我们希望这篇文章对您的学习有所帮助。如果您有任何疑问,欢迎在评论区留言。