重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
# -*- 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
nums = len(pre)
# 如果长度为0的话,说明这个分支没有数据了,返回None
if nums == 0:
return None
# 从pre去pop出下一个根节点的值
head = pre.pop(0)
tn = TreeNode(head)
# 如果只有一个值,说明没有子节点了
if nums == 1:
return(tn)
# 找到head的索引,进行切片,分成左右两个子树
i = tin.index(head)
pre_left = pre[:i]
pre_right = pre[i:]
tin_left = tin[:i]
tin_right = tin[i+1:]
tn.left = self.reConstructBinaryTree(pre_left, tin_left)
tn.right = self.reConstructBinaryTree(pre_right, tin_right)
return(tn)
题解:这里是用递归的思想,每次pre.pop(0),找出下一个根节点,然后根据其在tin中的index,对pre和tin进行分片,分片完后又是两个完整的左右子树,然后递归。