class Solution:
def buildTree(self, inorder: List[int], postorder: List[int]) -> TreeNode:
def helper(in_left, in_right):
# 如果这里没有节点构造二叉树了,就结束
if in_left > in_right:
return None
# 选择 post_idx 位置的元素作为当前子树根节点
val = postorder.pop()
root = TreeNode(val)
# 根据 root 所在位置分成左右两棵子树
index = idx_map[val]
# 构造右子树
root.right = helper(index + 1, in_right)
# 构造左子树
root.left = helper(in_left, index - 1)
return root
# 建立(元素,下标)键值对的哈希表
idx_map = {val:idx for idx, val in enumerate(inorder)}
return helper(0, len(inorder) - 1)
迭代
我们用一个栈和一个指针辅助进行二叉树的构造。初始时栈中存放了根节点(后序遍历的最后一个节点),指针指向中序遍历的最后一个节点;
我们依次枚举后序遍历中除了第一个节点以外的每个节点。如果 index 恰好指向栈顶节点,那么我们不断地弹出栈顶节点并向左移动 index,并将当前节点作为最后一个弹出的节点的左儿子;如果 index 和栈顶节点不同,我们将当前节点作为栈顶节点的右儿子;
无论是哪一种情况,我们最后都将当前的节点入栈。
class Solution(object):
def buildTree(self, inorder, postorder):
if not postorder:
return None
root = TreeNode(postorder[-1])
stack = [root]
inorderindex = len(inorder) - 1
for i in range(len(postorder)-2, -1, -1):
postorderVal = postorder[i]
node = stack[-1]
if node.val != inorder[inorderindex]:
node.right = TreeNode(postorderVal)
stack.append(node.right)
else:
while stack and stack[-1].val == inorder[inorderindex]:
node = stack.pop()
inorderindex -= 1
node.left = TreeNode(postorderVal)
stack.append(node.left)
return root