1.描述
根据一棵树的前序遍历与中序遍历构造二叉树。
或者一棵树的后序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
或者
中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
2.代码(递归)
from typing import List
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def rebuild_tree1(self, preorder: List, inorder: List):
"""
根据前序遍历和中序遍历结果重建二叉树
:param preorder: 前序遍历序列
:param inorder: 中序遍历序列
:return:
"""
if not preorder or not inorder:
return None
if len(preorder) != len(inorder):
return None
root = TreeNode(preorder[0])
root_index = inorder.index(preorder[0])
root.left = self.rebuild_tree1(preorder[1: root_index + 1], inorder[:root_index])
root.right = self.rebuild_tree1(preorder[root_index + 1:], inorder[root_index + 1:])
return root
def rebuild_tree2(self, postorder: List, inorder: List):
"""
根据后续遍历和中序遍历结果重建二叉树
:param postorder: 后序遍历序列
:param inorder: 中序遍历序列
:return:
"""
if not postorder or not inorder:
return None
if len(postorder) != len(inorder):
return None
root = TreeNode(postorder[-1])
root_index = inorder.index(postorder[-1])
root.left = self.rebuild_tree2(postorder[:root_index], inorder[:root_index])
root.right = self.rebuild_tree2(postorder[root_index: -1], inorder[root_index + 1:])
return root
preorder = [3, 9, 20, 15, 7]
inorder = [9, 3, 15, 20, 7]
postorder = [9, 15, 7, 20, 3]
# root = Solution().rebuild_tree1(preorder, inorder)
root = Solution().rebuild_tree2(postorder, inorder)
print(root.val)
print(root.left.val)
print(root.right.val)
print(root.right.left.val)
print(root.right.right.val)