重建二叉树--前序+中序

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

思路:
如果自己去重建,是先看前序遍历,找到第一个作为根,看它在中序遍历的位置,从而直接把左边的节点作为左子树,右边的节点作为右子树。反复遍历下去就好了。自然而然地可以想到用递归的方法解决。递归的思路挺简单,但是写代码的时候一定要记得处理好边界值。

  1. 看root在中序遍历的位置,如果位置大于0,说明左边有值,即有左子树。如果位置小于中序数组长度-1,说明右边有值,即有右子树。
  2. 确定好后,注意新数组的下标。这里主要提到1点,在python中,比如a=[1,2,3,4],如果写a[m:n] ,是指从m到n的切片,注意切片是包含m,但是不包含n!!!
  3. 个人写代码的语法小错误,即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

你可能感兴趣的:(重建二叉树--前序+中序)