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

本文介绍如何使用不同类型的数组(如先序、中序、后序)来重构二叉树,并提供具体的Python实现代码。文章重点讲解了在特定条件下如何通过先序、中序和后序遍历来重建一棵完整的二叉树。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

#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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值