golang 中后序遍历构建二叉树

题面

根据一棵树的中序遍历与后序遍历构造二叉树。假设树中没有重复的元素

中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]

返回二叉树
    3
   / \
  9  20
    /  \
   15   7

分析

  • 中序遍历将二叉树分成左右两棵子树 (左 根 右)
  • 后序遍历最后访问根结点 (左 右 根)

递归建树

  1. 先记住中序遍历中每个数出现的位置,通常用hash。(题目条件:不存在重复数,如果存在重复数会更加复杂)。
  2. build(inorder, postorder, 0 , n - 1, 0, n - 1) ,n 为树的结点个数。
  3. 以后序遍历的最后一个结点的值为根节点,如果inL > inR 则该子树为空,直接返回(pL > pR 也可以)。
  4. 找到这个数在中序遍历中位置 k,凭借 k 可以将中序遍历划分为左右两棵子树:(inL,k - 1), (k + 1, inR)
  5. 同时也可将后序遍历划分为两棵子树:(pL, pL + k - inL - 1), (pL + k - inL, pR -1)。表达式较复杂,主要是计算结点的个数
  6. 递归继续…

实现

此法类似于刻舟求剑(hash数据一次成型),但无需要在递归时维护一个数组副本,亦不需要每次递归动态比对中序遍历索引

func buildTree(inorder []int, postorder []int) *TreeNode {
    m :=make(map[int]int,len(inorder))
    var bt func(int,int,int,int)*TreeNode
    
    for i,v:=range inorder{
        m[v]=i
    }

    bt=func(inL,inR,postL,postR int)*TreeNode{
        if inL > inR || postL > postR {
            return nil
        }
        k := m[postorder[postR]]
        return  &TreeNode{
            Val:postorder[postR],
            Left:bt(inL, k - 1, postL, postL + k - 1 - inL),
            Right:bt(k + 1, inR, postL + k - inL, postR - 1),
        }
    }

    return bt(0,len(inorder)-1,0,len(postorder)-1)
}

python版

递归动态查询各层,目标数根节点在当层中序中的索引,求索方便,但耗费空间比上述go高20倍

class Solution:
    def buildTree(self, inorder: List[int], postorder: List[int]) -> TreeNode:
        if not postorder:
            return None
        
        root = TreeNode(postorder.pop())
        index = inorder.index(root.val)

        root.left = self.buildTree(inorder[:index],postorder[:index])
        root.right = self.buildTree(inorder[index+1:],postorder[index:])
        
        return root
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值