剑指Offer(Python多种思路实现):重建二叉树
面试7题:
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
解题思路一:递归
# 7重建二叉树 【递归】
class TreeNode: # 先定义树的基本结构
def __init__(self, x):
self.val=x
self.left=None
self.right=None
class Solution:
def reConstructBinaryTree(self, pre, tin):
if not pre or not tin: # 检测有无中序和先序遍历
return None
root = TreeNode(pre[0])
val = tin.index(pre[0]) # .index可以查找列表里面值的下表
root.left = self.reConstructBinaryTree(pre[1:val+1], tin[:val]) # val+1:val为3,列表要求[1:4]
root.right = self.reConstructBinaryTree(pre[val+1:], tin[val+1:])
解题思路二:空间复杂度更低的解法。
def buildTree(self, preorder: 'List[int]', inorder: 'List[int]') -> 'TreeNode':
def build(stop):
if inorder and inorder[-1] != stop:
root = TreeNode(preorder.pop())
root.left = build(root.val)
inorder.pop()
root.right = build(stop)
return root
preorder.reverse()
inorder.reverse()
return build(None)