当前位置: 首页 > article >正文

【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)的图解。


http://www.kler.cn/a/520479.html

相关文章:

  • 双足机器人开源项目
  • Spring Boot(6)解决ruoyi框架连续快速发送post请求时,弹出“数据正在处理,请勿重复提交”提醒的问题
  • 图漾相机搭配VisionPro使用简易教程
  • Effective C++ 规则50:了解 new 和 delete 的合理替换时机
  • Vue入门(Vue基本语法、axios、组件、事件分发)
  • 讯飞绘镜(ai生成视频)技术浅析(二):大模型
  • 二级C语言题解:孤独数、找最长子串、返回两数组交集
  • 每日一题-判断是不是完全二叉树
  • 二叉堆--优先级队列和堆排序
  • MySQL(高级特性篇) 12 章——数据库其它调优策略
  • Flink运行时架构
  • Netty框架学习笔记
  • GPU算力平台|在GPU算力平台部署AI虚拟换衣模型(CatVTON)的应用实战教程
  • 模拟电子技术-常用半导体器件
  • RabbitMQ模块新增消息转换器
  • [MySQL]数据库的效率问题与索引的底层原理
  • 人工智能丨Midscene:让UI自动化测试变得更简单
  • 高温环境对电机性能的影响与LabVIEW应用
  • 1.27 保存和加载链表内容
  • 笔试-二维数组2
  • 深入探讨数据库索引类型:B-tree、Hash、GIN与GiST的对比与应用
  • 在AlarmLinux系统中安装KeyDB
  • 01绪论 + 递归+分治+搜索+回溯+原码反码补码+进制+位运算+位图(D2_刷题练习)
  • JVM深入学习(二)
  • Effective C++ 规则50:了解 new 和 delete 的合理替换时机
  • convnext 网络结构简介