📅  最后修改于: 2023-12-03 14:49:27.766000             🧑  作者: Mango
在二叉树的前序遍历中,我们首先访问根节点,然后依次遍历左子树和右子树。而在二叉树的后序遍历中,我们首先遍历左子树和右子树,最后访问根节点。如果给定了二叉树的前序遍历和后序遍历,我们可以通过这两个遍历构造出完整的二叉树。本文将介绍这个算法,并提供代码实现。
二叉树的前序遍历可以表示为:Root, LeftSubtree, RightSubtree。
二叉树的后序遍历可以表示为:LeftSubtree, RightSubtree, Root。
从中我们可以发现,在前序遍历中,第一个节点即为根节点,而在后序遍历中,最后一个节点也为根节点。因此,我们可以通过前序遍历找到根节点,然后通过后序遍历找到左子树和右子树的边界,递归构建整个二叉树。
实现的关键是如何找到左右子树的边界。我们可以先找到前序遍历中左子树的根节点,然后在后序遍历中找到它的位置,就可以知道左右子树的大小,然后递归构建。
class TreeNode:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
def constructFromPrePost(pre, post):
if not pre:
return None
root = TreeNode(pre[0])
if len(pre) == 1:
return root
left_val = pre[1]
left_len = post.index(left_val) + 1
root.left = constructFromPrePost(pre[1:1 + left_len], post[:left_len])
root.right = constructFromPrePost(pre[1 + left_len:], post[left_len:-1])
return root
代码中的constructFromPrePost
函数接受前序遍历pre
和后序遍历post
作为参数,返回构建好的二叉树的根节点。
首先判断前序遍历是否为空,为空则返回None
。然后根据前序遍历构建根节点root
,如果pre
中只有一个节点,则返回root
。
接下来,我们需要确定左子树和右子树的大小。在前序遍历中,左子树的根节点为pre[1]
,我们可以在后序遍历中找到它的位置,然后就能确定左右子树的大小。递归地构建左子树和右子树,最后返回根节点。
以下是一个测试样例:
pre = [1, 2, 4, 5, 3, 6, 7]
post = [4, 5, 2, 6, 7, 3, 1]
tree = constructFromPrePost(pre, post)
print(tree.val) # 1
print(tree.left.val) # 2
print(tree.right.val) # 3
输出结果:
1
2
3
本文介绍了从给定的前序和后序遍历构造完整的二叉树的算法及其实现。虽然该算法的时间复杂度为$O(n^2)$,但仍然是解决二叉树相关问题的有效方法之一。