剑指offer实践 ——7.重建二叉树(python版)

剑指offer实践 ——7.重建二叉树(python版)

题目

在这里插入图片描述

二叉树的遍历

先序遍历:按照中->左->右的顺序遍历整棵树。
中序遍历:按照左->中->右的顺序遍历整棵树。
后序遍历:按照左->右->中的顺序遍历整棵树。

例如下图的树:
在这里插入图片描述
先序遍历:[1,2,4,7,3,5,6,8]
中序遍历:[4,7,2,1,5,3,8,6]
后序遍历:[7,4,2,5,8,6,3,1]

二叉树的定义

class Binary_Tree():

    def __init__(self, root=None, left=None, right=None, parent=None):
        self.root = root
        self.left = left
        self.right = right

题解

def rebuild_btree_pre_in(preorder, inorder):
    '''利用先序的第一个是根节点,在中序中划分左右子树后递归'''
    b = Binary_Tree()
    b.root = preorder[0]
    split_index = inorder.index(b.root)
    left_tree_inorder = inorder[:split_index]
    right_tree_inorder = inorder[split_index+1:]

    left_len = len(left_tree_inorder)
    left_pre = preorder[1:left_len+1]
    right_pre = preorder[left_len+1:]

    if left_pre and left_tree_inorder:
        b.left = rebuild_btree_pre_in(left_pre, left_tree_inorder)
    if right_pre and right_tree_inorder:
        b.right = rebuild_btree_pre_in(right_pre, right_tree_inorder)

    return b

拓展

重建二叉树:中序后序

def rebuild_btree_in_post(inorder, postorder):
    b = Binary_Tree()
    b.root = postorder[-1]

    index = inorder.index(b.root)
    left_tree_in = inorder[:index]
    right_tree_in = inorder[index+1:]

    left_len = len(left_tree_in)
    left_tree_post = postorder[:left_len]
    right_tree_post = postorder[left_len:-1]

    if left_tree_in and left_tree_post:
        b.left = rebuild_btree_in_post(left_tree_in, left_tree_post)
    if right_tree_in and right_tree_post:
        b.right = rebuild_btree_in_post(right_tree_in, right_tree_post)
    return b

重建二叉树:先序后序,不能唯一确定一棵树,统计不同的树形等待后序更新哈~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值