105. 从前序与中序遍历序列构造二叉树 --力扣 --JAVA

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

 题目

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

解题思路

    1. 先序遍历:根左右;
    2. 中序遍历:左根右;
    3. 从先序遍历中确定根节点,再从中序遍历中判断左右子树的长度范围,从而确定左右子树的根节点。

    代码展示

    class Solution {
        public TreeNode buildTree(int[] preorder, int[] inorder) {
            int size = preorder.length;
            Map<Integer,Integer> store = new HashMap<>();
            for (int i = 0; i < inorder.length; i++){
                store.put(inorder[i],i);
            }
            return build(preorder, store,0,0,size - 1);
        }
        private TreeNode build(int[] preorder, Map<Integer,Integer> store, int root,int left,int right){
            if(left > right){
                return null;
            }
            TreeNode node = new TreeNode(preorder[root]);
            int middle = store.get(preorder[root]);
            node.left = build(preorder, store,root + 1, left, middle - 1);
            //middle - left是左子树的长度 1表示下一个节点
            node.right = build(preorder, store,root + middle - left + 1, middle + 1, right);
            return node;
        }
    }

    image.gif


    目录
    相关文章
    |
    1月前
    |
    存储 Java 开发者
    在 Java 中,如何遍历一个 Set 集合?
    【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
    |
    2月前
    |
    Java 程序员 编译器
    Java|如何正确地在遍历 List 时删除元素
    从源码分析如何正确地在遍历 List 时删除元素。为什么有的写法会导致异常,而另一些不会。
    33 3
    |
    2月前
    |
    前端开发 小程序 Java
    java基础:map遍历使用;java使用 Patten 和Matches 进行正则匹配;后端传到前端展示图片三种情况,并保存到手机
    这篇文章介绍了Java中Map的遍历方法、使用Pattern和matches进行正则表达式匹配,以及后端向前端传输图片并保存到手机的三种情况。
    22 1
    |
    2月前
    【LeetCode 31】104.二叉树的最大深度
    【LeetCode 31】104.二叉树的最大深度
    20 2
    |
    2月前
    【LeetCode 29】226.反转二叉树
    【LeetCode 29】226.反转二叉树
    18 2
    |
    2月前
    【LeetCode 28】102.二叉树的层序遍历
    【LeetCode 28】102.二叉树的层序遍历
    16 2
    |
    2月前
    【LeetCode 43】236.二叉树的最近公共祖先
    【LeetCode 43】236.二叉树的最近公共祖先
    20 0
    |
    2月前
    【LeetCode 38】617.合并二叉树
    【LeetCode 38】617.合并二叉树
    15 0
    |
    2月前
    【LeetCode 37】106.从中序与后序遍历构造二叉树
    【LeetCode 37】106.从中序与后序遍历构造二叉树
    18 0
    |
    2月前
    【LeetCode 34】257.二叉树的所有路径
    【LeetCode 34】257.二叉树的所有路径
    21 0