(python)《剑指offer》面试题7:重建二叉树

题目:重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,重建该二叉树。假设输入的前序遍历和中序遍历的结果都不包含重复数字。
例如:输入
前序遍历【1,2,4,7,3,5,6,8】
中序遍历【4,7,2,1,5,3,8,6】,
则重建二叉树 【1, 2, 3, 4, 5, 6, 7, 8】

题目分析

对于前序遍历,其遍历规则是 根节点→左子树→右子树
对于中序遍历, 其遍历规则是 左子树→根节点→右子树
因此对于前序遍历的第一个数字就是根节点的值
在这里插入图片描述
扫描中序遍历序列,就能确定根节点的位置
在这里插入图片描述
根据中序遍历序列的特点,在根节点的值1前面的3个数字都是左子树节点的值,位于1后面的数字都是右子树节点的值。
由于在中序序列中,有3个数字是左子树节点的值,因此左子树共有3个左字节点。同样,在前序序列中,根节点后面的3个数字就是左子树节点的值,再后面的所有数字都是右子树节点的值。这样就从前序遍历和中序遍历两个序列中分别找到了左、右子树对应的子序列
在这里插入图片描述
接下来的事情可以使用递归完成。

code

定义树节点的类

class Node(object):
    def __init__(self, item):
        self.item = item 
        self.lchild = None 
        self.rchild = None 
    def travel(self):
    # 用于打印重建好的二叉树
        if self is None:
            return 
        queue = [self]
        while queue:
            cur_node = queue.pop(0)
            print(cur_node.item, end=' ')
            if cur_node.lchild is not None:
                queue.append(cur_node.lchild)
            if cur_node.rchild is not None:
                queue.append(cur_node.rchild)

递归实现二叉树的重建

def ReConstructBinaryTree(PreArray, MidArray):
    if len(PreArray) > 0:
        root = Node(PreArray[0])
        rootId = MidArray.index(root.item)
        root.lchild = ReConstructBinaryTree(PreArray=PreArray[1: rootId+1], 
                                            MidArray=MidArray[0: rootId])
        root.rchild = ReConstructBinaryTree(PreArray=PreArray[rootId+1:], 
                                            MidArray=MidArray[rootId+1:])
        return root 

测试程序

if __name__ == '__main__':
    ReConstructBinaryTree([1,2,4,7,3,5,6,8], [4,7,2,1,5,3,8,6]).travel()

打印输出,输出结果为重建二叉树的层次遍历。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值