• 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 保证 为二叉树的中序遍历序列

     Related Topics

    • 数组
    • 哈希表
    • 分治
    • 二叉树

     重点!!!解题思路

    第一步: 

    这道题我们使用递归和栈的思想来解决此题

    前序遍历:根左右,中序遍历,左右根。

    我们能很容易的得到前序遍历的根节点,但是不容易拿到中序遍历根节点的下标

    所以我们首先采用map集合来存储中序遍历的节点值

    第二步:

    使用递归来创建根节点下的每个节点

    明白上述思路即可实现此题 

    源码+讲解:

    1. class Solution {
    2. Map map;
    3. public TreeNode buildTree(int[] preorder, int[] inorder) {
    4. map = new HashMap<>(); //存储inorder的所有节点
    5. for (int i=0;i
    6. map.put(inorder[i],i);
    7. }
    8. return helper(preorder,inorder,0,preorder.length-1,0,inorder.length-1);//递归求解
    9. }
    10. public TreeNode helper(int[] preorder, int[] inorder,int p_start,int p_end,int i_start,int i_end){ //每次传起始和终末值
    11. if (p_start>p_end) return null; //空节点的返回
    12. TreeNode root = new TreeNode(preorder[p_start]); //节点创建
    13. int mid = map.get(preorder[p_start]);//获得根节点
    14. int leftNum=mid-i_start;//根据中序遍历来得到左子树的长度
    15. root.left=helper(preorder,inorder,p_start+1,p_start+leftNum,i_start,mid-1);
    16. root.right=helper(preorder,inorder,p_start+leftNum+1,p_end,mid+1,i_end);
    17. return root;
    18. }
    19. }

    运行结果:

     

    如果您还有什么疑问或解答有问题,可在下方评论,我会及时回复。 

    系列持续更新中,点个订阅吧

  • 相关阅读:
    商务部研究院信用所、启信宝联合发布《中国商务信用发展指数报告(2022)》
    《C和指针》(1)快速上手
    Springboot基于web的游泳馆信息管理系统 毕业设计-附源码281444
    聊一聊 GDB 调试程序时的几个实用命令
    自动控制原理5.2---典型环节与开环系统的频率特性
    VulnHub--Lampiao-linux脏牛漏洞提权
    CUDA指针数组Kernel函数
    Zookeeper、Kafka集群与Filebeat+Kafka+ELK架构、部署实例
    使用LIMIT分页
    leetcode 1342.将数字变成0的操作次数
  • 原文地址:https://blog.csdn.net/m0_57209427/article/details/127914198