@剑指offer(Python)重建二叉树

剑指offer刷题笔记4(Python)

题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

思路

由于二叉树每一层的结构几乎相同的特性(都是根节点和左右节点),因此对于二叉树的题目,递归几乎是通用的方法。因此这个题目就可以用递归的方法来进行求解。

注:二叉树的三种遍历方法

在这里插入图片描述
假如,有上图所示的一个二叉树,那么这个二叉树的三种遍历顺序分别为:
前序遍历(根节点-左节点-右节点):ABDECFG
中序遍历(左节点-根节点-右节点):DBEAFGC
后序遍历(左节点-右节点-根节点):DEBGFCA

具体思路

1.找到整个二叉树根节点的值(即前序遍历序列的第一个值)val
2.找到在中序遍历序列中val值所在的下标,根据中序遍历法的规则,中序遍历序列val值之前的应该是val根节点的左子树的中序遍历序列,val右边是右节点的中序遍历序列。
3.根据左右子树的中序遍历序列的长度,截取左右子树的前序遍历序列(每一部分的前序和中序序列是相同的)
4.对左右子树的前序遍历序列和中序遍历序列分别递归,求得整个二叉树根节点的左右子树
5.利用val值生成根节点,并将其左右子树分别于之前递归的结果相等。

代码

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    # 返回构造的TreeNode根节点
    def reConstructBinaryTree(self, pre, tin):
        # write code here
        if pre == []:    # 如果前序遍历序列为空,返回None
            return None
        val = pre[0]    # 找到整个二叉树根节点的值,val
        index = tin.index(val)       # 找到val在中序遍历序列的位置,并以此为分界线,分别得到左中序和右中序
        lefttin = tin[:index]
        righttin = tin[index+1:]
        leftpre = pre[1:len(lefttin)+1]      # 根据左右中序的列表长度得到左右前序
        rightpre = pre[len(lefttin)+1:]
        root = TreeNode(val)       # 生成以val为根节点值的二叉树
        root.left = self.reConstructBinaryTree(leftpre,lefttin)       # 递归得到根节点的左子树,并与根节点root联系起来
        root.right = self.reConstructBinaryTree(rightpre,righttin)            # 递归得到根节点的右子树,并与根节点root联系起来
        return root   # 返回结果

猜你喜欢

转载自blog.csdn.net/ggdhs/article/details/89913207