码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【LeetCode】105.从前序与中序遍历序列构造二叉树


    题目

    给定两个整数数组 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:

    输入: preorder = [-1], inorder = [-1]
    输出: [-1]
    

    提示:

    • 1 <= preorder.length <= 3000
    • inorder.length == preorder.length
    • -3000 <= preorder[i], inorder[i] <= 3000
    • preorder 和 inorder 均 无重复 元素
    • inorder 均出现在 preorder
    • preorder 保证 为二叉树的前序遍历序列
    • inorder 保证 为二叉树的中序遍历序列

    解答

    源代码

    1. /**
    2. * Definition for a binary tree node.
    3. * public class TreeNode {
    4. * int val;
    5. * TreeNode left;
    6. * TreeNode right;
    7. * TreeNode() {}
    8. * TreeNode(int val) { this.val = val; }
    9. * TreeNode(int val, TreeNode left, TreeNode right) {
    10. * this.val = val;
    11. * this.left = left;
    12. * this.right = right;
    13. * }
    14. * }
    15. */
    16. class Solution {
    17. private Map indexMap;
    18. public TreeNode buildTree(int[] preorder, int[] inorder) {
    19. int n = preorder.length;
    20. indexMap = new HashMap();
    21. for (int i = 0; i < n; i++) {
    22. indexMap.put(inorder[i], i);
    23. }
    24. return myBuildTree(preorder, inorder, 0, n - 1, 0, n - 1);
    25. }
    26. public TreeNode myBuildTree(int[] preorder, int[] inorder, int preorderLeft, int preorderRight, int inorderLeft, int inorderRight) {
    27. if (preorderLeft > preorderRight) {
    28. return null;
    29. }
    30. // 前序遍历的第一个节点就是根结点
    31. TreeNode root = new TreeNode(preorder[preorderLeft]);
    32. // 左子树节点数
    33. int leftSize = indexMap.get(preorder[preorderLeft]) - inorderLeft;
    34. int rightSize = inorderRight - indexMap.get(preorder[preorderLeft]);
    35. root.left = myBuildTree(preorder, inorder, preorderLeft + 1, preorderLeft + leftSize, inorderLeft, inorderLeft + leftSize - 1);
    36. root.right = myBuildTree(preorder, inorder, preorderLeft + leftSize + 1, preorderRight, inorderLeft + leftSize + 1, inorderRight);
    37. return root;
    38. }
    39. }

    总结

    对于任意一颗树而言,前序遍历的形式总是:

    [ 根节点, [左子树的前序遍历结果], [右子树的前序遍历结果] ]

    即根节点总是前序遍历中的第一个节点。而中序遍历的形式总是:

    [ [左子树的中序遍历结果], 根节点, [右子树的中序遍历结果] ]

    只要我们在中序遍历中定位到根节点,那么我们就可以分别知道左子树和右子树中的节点数目。由于同一颗子树的前序遍历和中序遍历的长度显然是相同的,因此我们就可以对应到前序遍历的结果中,对上述形式中的所有左右括号进行定位。

    这样以来,我们就知道了左子树的前序遍历和中序遍历结果,以及右子树的前序遍历和中序遍历结果,我们就可以递归地对构造出左子树和右子树,再将这两颗子树接到根节点的左右位置。

  • 相关阅读:
    OpenGL - Coordinate Systems
    如何使用Stable Diffusion生成艺术二维码?
    25.cuBLAS开发指南中文版--cuBLAS中的Level-2函数symv()
    LeetCode 31. 下一个排列
    高薪程序员&面试题精讲系列140之你熟悉分布式事务吗--下篇?有哪些分布式事务实现方案?
    【Kubernetes 系列】一文带你吃透 K8S 应用pod结点
    JAVA 版多商家入驻 直播带货 商城系统 B2B2C 商城免费搭建之 B2B2C产品概述
    keepalived原理以及lvs、nginx跟keeplived的运用
    YOLOv8+PyQt5农作物杂草检测系统完整资源集合(yolov8模型,从图像、视频和摄像头三种路径识别检测,包含登陆页面、注册页面和检测页面)
    下一代实时数据库:Apache Doris 【一】简介
  • 原文地址:https://blog.csdn.net/qq_57438473/article/details/132650242
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号