LeetCode_105_从前序与中序遍历序列构造二叉树_hn

题目描述

根据一棵树的前序遍历与中序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。

例如,给出

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

返回如下的二叉树:

    3
   / \
  9  20
    /  \
   15   7

解答方法

方法一:递归

思路

先来了解一下前序遍历和中序遍历是什么。

前序遍历:遍历顺序为 父节点 -> 左子节点 -> 右子节点
后续遍历:遍历顺序为 左子节点 -> 父节点 -> 右子节点
我们可以发现:前序遍历的第一个元素为根节点,而在后序遍历中,该根节点所在位置的左侧为左子树,右侧为右子树。

例如在例题中:

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

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

preorder 的第一个元素 3 是整棵树的根节点。inorder 中 3 的左侧 [9] 是树的左子树,右侧 [15, 20, 7] 构成了树的右子树。

所以构建二叉树的问题本质上就是:

1、找到各个子树的根节点 root
2、构建该根节点的左子树
3、构建该根节点的右子树

代码

class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
        if len(preorder) == 0:
            return None
# 前序遍历第一个值为根节点
        root = TreeNode(preorder[0])
# 因为没有重复元素,所以可以直接根据值来查找根节点在中序遍历中的位置
        i = inorder.index(preorder[0])
# 构建左子树
        root.left = self.buildTree(preorder[1:i+1], inorder[:i])
# 构建右子树
        root.right = self.buildTree(preorder[i+1:], inorder[i+1:])
        return root

时间复杂度

空间复杂度

提交结果

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 题目#105.从前序与中序遍历序列构造二叉树 根据一棵树的前序遍历与中序遍历构造二叉树。 注意:你可以假设树中没有...
    qiHuang112阅读 2,844评论 0 0
  • 前言 二叉树遍历是非常经典的算法题,也是二叉树的一道基础算法题。 但是在平常的笔试面试中,其出现的频率其实并不是特...
    蛮三刀酱阅读 5,201评论 0 0
  • 树形结构 在前面章节中介绍到的数据结构,都为线性结构,比如链表,数组,队列等,都属于线性结构,类似于通过一根线串在...
    ducktobey阅读 5,117评论 0 0
  • 今天看了篇文章,里面说关于所有女生最在乎最关心的年龄,怕老,徐静蕾曾说:“除非你觉得美和年轻是你最大的优点,要...
    D009十字阅读 1,666评论 0 0
  • 下班到家,姥姥正在做饭,你和弟弟坐在地板上正在专注的拼科学现场,互助互爱。 晚饭后你把碗洗了,虽然手受了一点小伤,...
    可爱的宝阅读 1,495评论 1 4

友情链接更多精彩内容