美文网首页
重建二叉树--前序+中序

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

作者: hustyanye | 来源:发表于2019-07-28 16:13 被阅读0次

    输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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<len(tin)-1:
                root.right = self.buildTree(pre[pos_tin+1:len(pre)],tin[pos_tin+1:len(tin)])
            return root
    

    相关文章

      网友评论

          本文标题:重建二叉树--前序+中序

          本文链接:https://www.haomeiwen.com/subject/aahprctx.html