中序和先序遍历恢复二叉树python(年度更新系列)
输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]
这种问题的思路直接分三步走:
1.通过先序遍历找出根节点:
rival = preorder[0];
root = TreeNode(rival)
mid = inorder.index(rival)
实现了找出根结点,并找出其下标index,以便于分割队列。
2.分割中序和先序的队列:
preorder_left = [1:mid+1]
preorder_left = [mid+1:]
inorder_left = [:mid]
inorder_right = [mid+1:]
3.开始递归:
root.left = self.buildTree(preorder_left,inorder_left)
root.right = self.buildTree(preorder_right,inorder_right)
具体代码如下:
class Solution(object):
def buildTree(self, preorder, inorder):
if len(inorder) == 0:
return None
#如果队列为空则直接返回
rival = preorder[0]
root = TreeNode(rival)
mid = inorder.index(rival)
#创建根结点,并找出中序遍历的下标。
preorder_left = preorder[1:mid+1]
preorder_left = preorder[mid+1:]
inorder_left = inorder[:mid]
inorder_right = inorder[mid+1:]
#分割两个列表
root.left = self.buildTree(preorder_left,inorder_left)
root.right = self.buildTree(preorder_right,inorder_right)
#递归的求解。
return root