106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode)
思路:(中序遍历是左中右,后序遍历是左右中)
递归出口:当后序遍历数组为空时,返回空。
单层递归逻辑:
- 弹出后序遍历数组的最后一个元素,将其做为树节点的值;如果此时后序遍历数组为空了,返回树节点。
- 根据后序遍历数组的最后一个元素来切分中序遍历数组;因为左子树的元素数量相同,再根据切分后的中序遍历数组来切分后序遍历数组。
class Solution(object):
def buildTree(self, inorder, postorder):
if len(postorder)==0:
return
node=TreeNode(val=postorder.pop())
if len(postorder)==0:
return node
index=inorder.index(node.val)
node.left=self.buildTree(inorder[:index],postorder[:index])
node.right=self.buildTree(inorder[index+1:],postorder[index:])
return node
105. 从前序与中序遍历序列构造二叉树 - 力扣(LeetCode)
思路同上,除了切分略有不同。
class Solution(object):
def buildTree(self, preorder, inorder):
if len(preorder)==0:
return
node=TreeNode(val=preorder.pop(0))
if len(preorder)==0:
return node
index=inorder.index(node.val)
node.left=self.buildTree(preorder[:index],inorder[:index])
node.right=self.buildTree(preorder[index:],inorder[index+1:])
return node