二叉树问题---先序,中序,和后序数组两两结合重构二叉树

注意:
  如果一棵二叉树除叶节点之外,其他的节点都有左孩子和右孩子,这样的树才能被先序后序数组重建

#python3.5
#先序,中序数组重构二叉树
def preInToTree(pre, mid):
    def preIn(pre, pi, pj, mid, mi, mj, map):
        if pi > pj:
            return None
        head = TreeNode(pre[pi])
        index = map.get(pre[pi])
        head.left = preIn(pre, pi+1, pi+index-mi, mid, mi, index-1, map)
        head.right = preIn(pre, pi+index-mi+1, pj, mid, index+1, mj, map)
        return head

    if pre == None or mid == None or len(pre) != len(mid):
        return None
    map = {}
    for i in range(len(mid)):
        map[mid[i]] = i
    return preIn(pre, 0, len(pre)-1, mid, 0, len(mid)-1, map)

#中序,后序数组重构二叉树
def inPosToTree(mid, pos):
    def inPos(mid, mi, mj, pos, si, sj, map):
        if si > sj:
            return None
        head = TreeNode(pos[sj])
        index = map.get(pos[sj])
        head.left = inPos(mid, mi, index-1, pos, si, si+index-mi-1, map)
        head.right = inPos(mid, index+1, mj, pos, si+index-mi, sj-1, map)
        return head


    if mid == None or pos == None or len(mid) != len(pos):
        return None
    map = {}
    for i in range(len(mid)):
        map[mid[i]] = i
    return inPos(mid, 0, len(mid)-1, pos, 0, len(pos)-1, map)

#先序,后序数组重构二叉树
#一棵二叉树除叶子节点外,其他所有的节点都有左孩子和右孩子,才能被先序和后序数组重构出来
def prePosToTree(pre, pos):
    def prePos(pre, pi, pj, pos, si, sj, map):
        head = TreeNode(pre[pi])
        if pi == pj:
            return head
        pi += 1
        index = map.get(pre[pi])
        head.left = prePos(pre, pi, pi+index-si, pos, si, index, map)
        head.right = prePos(pre, pi+index-si+1, pj, pos, index+1, sj-1, map)
        return head

    if pre == None or pos == None or len(pre) != len(pos):
        return None
    map = {}
    for i in range(len(pos)):
        map[pos[i]] = i
    return prePos(pre, 0, len(pre)-1, pos, 0, len(pos)-1, map)
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值