• 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. }

    运行结果:

     

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

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

  • 相关阅读:
    css记录:三维变换之transition
    Matlab基础用法
    vue3中vue-pdf-embed实现放大、缩小、上一页、下一页、滚动翻页功能(pdf文件预览)
    基因组的Phasing原理
    Day 14:2938. 区分黑球和白球
    时间序列数据可视化:Pyecharts日历图
    Element Plus& Ant Design(react) 表格的分页封装
    Python的基础:模块(Modules)和包(Packages)详解
    解决warning: this statement may fall through [-Wimplicit-fallthrough=]
    在边缘计算场景中使用Dapr
  • 原文地址:https://blog.csdn.net/m0_57209427/article/details/127914198