题目描述
根据一棵树的中序遍历与后序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
解题思路
由105.从前序与后序遍历序列构造二叉树一题中,得到了一种递归的构建方法。对于后序遍历,如果将其访问顺序进行逆序,可得到如下顺序:根节点→右子树→左子树。这一顺序与前序遍历非常相似,因此,仍可采用105题的方法。只不过这次,需要将左右子树的建立顺序对调,先建立右子树,再建立左子树。
代码
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def buildTree(self, inorder, postorder):
"""
:type inorder: List[int]
:type postorder: List[int]
:rtype: TreeNode
"""
def build(pre,ino):
if len(pre)>1:
r=TreeNode(pre[0])
index=ino.index(pre[0])
left_num=index
right_num=len(ino)-1-index
r.right=build(pre[1:1+right_num],ino[index+1:])
r.left=build(pre[1+right_num:],ino[0:index])
elif len(pre)==1:
r=TreeNode(pre[0])
else:
return None
return r
return build(postorder[::-1],inorder)
结果
反思
目前执行最快代码如下:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def buildTree(self, inorder, postorder):
"""
:type inorder: List[int]
:type postorder: List[int]
:rtype: TreeNode
"""
if not inorder or not postorder:
return
postorder.reverse()
root = TreeNode(postorder[0])
stack = [root]
i = len(inorder) - 1
for node in postorder[1:]:
parent = stack[-1]
if parent.val != inorder[i]:
parent.right = TreeNode(node)
stack.append(parent.right)
else:
while stack and stack[-1].val == inorder[i]:
parent = stack.pop()
i -= 1
parent.left = TreeNode(node)
stack.append(parent.left)
return root
与105题的思路基本一致。