【LeetCode: 105. 从前序与中序遍历序列构造二叉树 + DFS】

🚀 算法题 🚀

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀

🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨

🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎

🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻

🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

🚀 算法题 🚀

🍔 目录

    • 🚩 题目链接
    • ⛲ 题目描述
    • 🌟 求解思路&实现代码&运行结果
      • ⚡ DFS
        • 🥦 求解思路
        • 🥦 实现代码
        • 🥦 运行结果
        • 💬 共勉

          🚩 题目链接

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

            🌟 求解思路&实现代码&运行结果


            ⚡ DFS

            🥦 求解思路
            1. 该题主要是通过前序和中序遍历来还原一颗二叉树,核心的思路:在前序中找到根节点,根据该节点在中序遍历数组中的位置,根据中序划分左右子树,递归这个过程,还原一颗二叉树。
            2. 有了基本的思路,接下来我们就来通过代码来实现一下递归和迭代的解法。
            🥦 实现代码
            /**
             * Definition for a binary tree node.
             * public class TreeNode {
             * int val;
             * TreeNode left;
             * TreeNode right;
             * TreeNode() {}
             * TreeNode(int val) { this.val = val; }
             * TreeNode(int val, TreeNode left, TreeNode right) {
             * this.val = val;
             * this.left = left;
             * this.right = right;
             * }
             * }
             */
            class Solution { public TreeNode buildTree(int[] preorder, int[] inorder) { if (preorder.length == 0 || inorder.length == 0)
                        return null;
                    int head = preorder[0];
                    TreeNode node = new TreeNode(head);
                    for (int i = 0; i < inorder.length; i++) { if (inorder[i] == head) { node.left = buildTree(Arrays.copyOfRange(preorder, 1, i + 1), Arrays.copyOfRange(inorder, 0, i));
                            node.right = buildTree(Arrays.copyOfRange(preorder, i + 1, preorder.length),
                                    Arrays.copyOfRange(inorder, i + 1, inorder.length));
                            break;
                        }
                    }
                    return node;
                }
            }
            
            🥦 运行结果

            💬 共勉

            最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉!