【leetcode100】从前序与中序遍历序列构造二叉树

1、题目描述

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

示例 1:

复制代码
输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]

2、初始思路

2.1 思路

前序遍历中第一个节点为根节点,根据根节点可以在中序遍历中分辨出来左子树和右子树的节点,然后按照相同的方法,可以构建左子树和右子树的子树。

复制代码
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]:
        #方便查找根节点的位置
        dic = {}
        for i in range(len(inorder)):
            dic[inorder[i]] = i
        def tree(root,left,right):
            if left > right:
                return
            #节点在前序遍历中的位置索引
            i = dic[preorder[root]]
            node = TreeNode(preorder[root])
            #见图
            node.left = tree(root+1,left,i-1)
            node.right = tree(i-left+root+1,i+1,right)
            return node
        return tree(0,0,len(preorder)-1)

以下为node.left = tree(root+1,left,i-1),node.right = tree(i-left+root+1,i+1,right)的图解。

相关推荐
纽扣66712 分钟前
【算法进阶之路】链表进阶:删除、合并、回文与排序全解析
数据结构·算法·链表
消失的旧时光-194330 分钟前
统一并发模型:线程、Reactor、协程本质是一件事(从线程到协程 · 第6篇·终章)
java·python·算法
智者知已应修善业41 分钟前
【51单片机不用数组动态数码管显示字符和LED流水灯】2023-10-3
c++·经验分享·笔记·算法·51单片机
AI进化营-智能译站1 小时前
ROS2 C++开发系列16-智能指针管理传感器句柄|告别ROS2节点内存泄漏与野指针
java·c++·算法·ai
CS创新实验室2 小时前
从盘边到芯端——硬盘接口七十年变迁史
算法·磁盘调度
zhaoyong2222 小时前
MySQL 存储过程中字符集与排序规则不匹配导致查询性能下降的解决方案
jvm·数据库·python
sinat_383437362 小时前
golang如何从Python转型Go开发_golang从Python转型Go开发攻略
jvm·数据库·python
rockey6272 小时前
基于AScript的python3脚本语言发布啦!
python·c#·.net·script·python3·eval·expression·function·动态脚本
gqk012 小时前
Python入门
python
xvhao20132 小时前
单源、多源最短路
数据结构·c++·算法·深度优先·动态规划·图论·图搜索算法