输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
思路:
如果自己去重建,是先看前序遍历,找到第一个作为根,看它在中序遍历的位置,从而直接把左边的节点作为左子树,右边的节点作为右子树。反复遍历下去就好了。自然而然地可以想到用递归的方法解决。递归的思路挺简单,但是写代码的时候一定要记得处理好边界值。
- 看root在中序遍历的位置,如果位置大于0,说明左边有值,即有左子树。如果位置小于中序数组长度-1,说明右边有值,即有右子树。
- 确定好后,注意新数组的下标。这里主要提到1点,在python中,比如a=[1,2,3,4],如果写a[m:n] ,是指从m到n的切片,注意切片是包含m,但是不包含n!!!
- 个人写代码的语法小错误,即python在新建立对象的时候,直接写a = TreeNode(x)即可,不要写为 a = new TreeNode(x).。。
# -*- 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
return self.buildTree(pre,tin)
def buildTree(self,pre,tin):
if len(pre) == 0:
return None
root = TreeNode(pre[0])
pos_tin = tin.index(root.val)
if pos_tin>0:
root.left = self.buildTree(pre[1:pos_tin+1],tin[0:pos_tin])
if pos_tin<len(tin)-1:
root.right = self.buildTree(pre[pos_tin+1:len(pre)],tin[pos_tin+1:len(tin)])
return root