leetcode105,106用前序/后序以及中序构造二叉树

题目的描述就不写了,给出一个前序/后序遍历的得到的数组,还有中序的数组构造出二叉树。

刚开始感觉是递归着做,后来105参考了下答案,106也就很快做出来了,毕竟是同样的思路。

按照题目示例:

后序:【9,15,7,20,3】。前序:【9,3,15,20,7】。

我们知道对于一个三节点二叉树,b,c是a的子树,那么中序:b,a,c,后序:b,c,a。

我们想要得到这个树的根节点,就要从后往前的处理后序遍历数组,这里首先是3。

3是根节点,我们还知道从前序遍历是树在最底层的投影相对位置。

那么就是说,3的左边【9】就是左子树,右边【15,20,7】就是右子树。我们依靠递归来不断地寻找它的根节点,也就是自顶向下构造出了一棵树。

接下来的细节是如何寻找下一个根节点。观察示例以及abc的示例,根节点向前一个节点总是右子树的根节点,而左子树的根节点与右子树的根节点相差了根节点+右边根的左子树的那么多距离。

接下来就是代码实现。

        def create(inst,inend,index):
            #inst中序序列起点,inend中序序列终点,index后序序列根节点位置
            if inst<=inend:#注意python特性,在inst>inend时会返回None
                v=postorder[index]#根节点值
                i=inorder.index(v)#用list的index函数查找根的位置,为了分割中序序列为左右子树序列
                t=TreeNode(v)
                #右子树的根节点在前一个位置
                t.right=create(i+1,inend,index-1)
                #左子树的根节点与右子树根节点还差了一个右子树
                t.left=create(inst,i-1,index-(inend-i)-1)
                return t

这是用后序,中序构造。

前序的完全可以举一反三,还是abc例子,前序遍历是:a,b,c,也就是说,根节点在第一个

直接改一改index的变化方式即可。

        def create(inst,inend,index):
            if inst<=inend:
                v=preorder[index]
                i=inorder.index(v)
                t=TreeNode(v)
                t.right = create(i + 1, inend, index + 1 + (i - inst))
                t.left=create(inst,i-1,index+1)
                return t

唯一要注意的一点是,根节点的下一个是左子树的根节点,然后隔了一个左子树是右根节点。

其余的大同小异。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值