剑指 Offer 07. 重建二叉树

46 篇文章 0 订阅

输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]

返回如下的二叉树:

    3
   / \
  9  20
    /  \
   15   7

1、题目分析

在学习数据结构的时候,我们都知道前序+中序 or 后序+中序都能确定一个二叉树。这个题目给定前序和中序的结果让我们去重建一个二叉树,那当然是用递归的思想呀,具体的操作是这样:从前序遍历的结果种先确定根节点,然后根据这个根节点的值去把中序遍历一分为二,然后就可以把前序遍历的结果划分为[根节点|左子树|右子树],把中序遍历的结果划分为[左子树|根节点|右子树]。那么就这样递归一直划分,先构建左子树,在构建右子树。那么递归总要有头有尾吧,递归的出口就是前序遍历的列表为空。

2、解题分析

  • 找出前序遍历的第一个节点item,然后用第一个节点的值去找到中序遍历种这个值的下标index。
  • 将第一个节点添加到根节点中去
  • 构建左子树
    • 前序遍历的列表[1:index+1],中序遍历的列表[:index]
  • 构建右子树
    • 前序遍历的列表[index+1:],中序遍历的列表[index+1:]

3、代码

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
        if len(preorder) == 0:
            return None
        
        ind = inorder.index(preorder[0])
        print(ind)
        root = TreeNode(preorder[0])
        print(root)
        #构建左子树
        root.left = self.buildTree(preorder[1:ind+1], inorder[:ind]) 
        #构建右子树
        root.right = self.buildTree(preorder[ind+1:], inorder[ind+1:])
        
        return root

总结:前序和后序不能确定一个二叉树;递归的构建二叉树根据分割出来的二叉树前序和中序进行构建;新的前序和中序都是找规律找出来的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值