重建二叉树
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
解题思路:
迭代,对于前序中序遍历序列找到根节点,及其对应的左右子树,重复递归迭代。
分别取前序遍历[1:val+1]和中序遍历的[:val]对应与左子树继续上一个过程,取前序遍历[val+1:]和中序遍历[val+1:]对应于右子树继续上一个过程,最终得以重建二叉树
root.left = self.reConstructBinaryTree(pre[1:val + 1], tin[:val])
root.right = self.reConstructBinaryTree(pre[val + 1:], tin[val + 1:])return root
代码:
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# 返回构造的TreeNode根节点
def reConstructBinaryTree(self, pre, tin):
# write code here
if not pre or not tin:
return None
root = TreeNode(pre[0])
val = tin.index(pre[0]) #找到中序序列的索引地址。
#print(root) 根据先序序列找到根节点,然后按照根节点在中序序列里找左边是左子树,右边是右子树
root.left = self.reConstructBinaryTree(pre[1:val+1], tin[:val])
root.right = self.reConstructBinaryTree(pre[val+1:], tin[val+1:])
return root