剑指 Offer 07. 重建二叉树(java解题)

offer,重建,二叉树,java,解题 · 浏览次数 : 37

小编点评

**题目 1** 输入: ``` preorder = [3,9,20,15,7] inorder = [9,3,15,20,7] ``` 输出: ``` [3,9,20,null,null,15,7] ``` **题目 2** **解题思路 个人思路** 每次查找前序遍历的节点 0作为root节点,在中序遍历中查找root节点所在位置,根据位置下标i将中序遍历数组分为左右两个左右子数组[0,i-1]和[i+1,len-1],对前序遍历数组,根据左右子树组的长度相同同样进行分组划分,然后递归调用函数,处理左右子树。 **数据类型功能函数总结** //数组int[] array_name=new int[len];//数组定义int len=array_name.length;//获得数组长度4. **java代码 1** ```java class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { this.val = x; } } class Solution { public TreeNode buildTree(int[] preorder, int[] inorder) { if (preorder.length == 0 && inorder.length == 0) { //特殊情况,也是递归的边界条件 return null; } else { //构造根节点 int root_val = preorder[0]; TreeNode root = new TreeNode(root_val); //在中序遍历数组中查找根节点位置 int find_root = 0; int i = 0; for (i = 0; i < inorder.length && find_root == 0; i++) { if (inorder[i] == root_val) { find_root = 1; } } //此时得到下标i+1,[0,i-1][i][i+1,len-1] //数组二分 int[] left_inorder = new int[i]; int[] right_inorder = new int[inorder.length - i - 1]; int[] left_preorder = new int[i]; int[] right_preorder = new int[inorder.length - i - 1]; for (int j = 0; j < i; j++) { left_inorder[j] = inorder[j]; left_preorder[j] = preorder[j + 1]; } for (int j = i + 1; j < inorder.length; j++) { right_inorder[j - i - 1] = inorder[j]; right_preorder[j - i - 1] = preorder[j]; } //递归调用 root.left = buildTree(left_preorder, left_inorder); root.right = buildTree(right_preorder, right_inorder); return root; } } } ```

正文

1. 题目

输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。

假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

示例 1:
示例

Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]
示例 2:

Input: preorder = [-1], inorder = [-1]
Output: [-1]

限制:

0 <= 节点个数 <= 5000

作者:Krahets
链接:https://leetcode.cn/leetbook/read/illustration-of-algorithm/99lxci/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2. 解题思路

个人思路

每次查找前序遍历的节点0作为root节点,在中序遍历中查找root节点所在位置,根据位置下标i将中序遍历数组分为左右两个左右子数组[0,i-1][i+1,len-1],对前序遍历数组,根据左右子树组的长度相同同样进行分组划分,然后递归调用函数,处理左右子树。

3. 数据类型功能函数总结

//数组
int[] array_name=new int[len];//数组定义
int len=array_name.length;//获得数组长度

4. java代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        if(preorder.length==0&&inorder.length==0){//特殊情况,也是递归的边界条件
            return null;
        }
        else{
            //构造根节点
            int root_val=preorder[0];//前序遍历的首元素为根节点的值
            TreeNode root=new TreeNode(root_val);//创建根节点
            //在中序遍历数组中查找根节点位置
            int find_root=0;
            int i=0;
            for(i=0;i<inorder.length&&find_root==0;i++){
                if(inorder[i]==root_val){
                    find_root=1;
                }
            }//此时得到下标i+1,[0,i-1][i][i+1,len-1]
            //数组二分
            i--;
            int[] left_inorder=new int[i];
            int[] right_inorder=new int[inorder.length-i-1];
            int[] left_preorder=new int[i];
            int[] right_preorder=new int[inorder.length-i-1];
            for(int j=0;j<i;j++){
                left_inorder[j]=inorder[j];
                left_preorder[j]=preorder[j+1];
            }
            for(int j=i+1;j<inorder.length;j++){
                right_inorder[j-i-1]=inorder[j];
                right_preorder[j-i-1]=preorder[j];
            }
            //递归调用
            root.left= buildTree(left_preorder, left_inorder);
            root.right= buildTree(right_preorder, right_inorder);
            return root;
        }
    }
}

与剑指 Offer 07. 重建二叉树(java解题)相似的内容:

剑指 Offer 07. 重建二叉树(java解题)

leetcode《图解数据结构》剑指 Offer 07. 重建二叉树(java解题)的解题思路和java代码,并附上java中常用数据结构的功能函数。

剑指Offer 05. 替换空格(java解题)

leetcode中《图解数据结构》的刷题记录,包含解题思路、java代码的知识点小结和遇到的一些错误类型,与君共勉。

剑指 Offer 32 - I. 从上到下打印二叉树(java解题)

leetcode《图解数据结构》剑指 Offer 32 - I. 从上到下打印二叉树的解题思路和java代码,并附上java中常用数据结构的功能函数。

剑指 Offer 32 - II. 从上到下打印二叉树 II(java解题)

leetcode《图解数据结构》剑指 Offer 32 - II. 从上到下打印二叉树II 的解题思路和java代码,并附上java中常用数据结构的功能函数。

剑指 Offer 32 - III. 从上到下打印二叉树 III(java解题)

leetcode《图解数据结构》剑指 Offer 32 - III. 从上到下打印二叉树 III(java解题)的解题思路和java代码,并附上java中常用数据结构的功能函数。

剑指 Offer 34. 二叉树中和为某一值的路径(java解题)

leetcode《图解数据结构》剑指 Offer 34. 二叉树中和为某一值的路径(java解题)的解题思路和java代码,并附上java中常用数据结构的功能函数。

剑指 Offer 55 - I. 二叉树的深度(java解题)

leetcode《图解数据结构》剑指 Offer 55 - I. 二叉树的深度(java解题)的解题思路和java代码,并附上java中常用数据结构的功能函数。

剑指 Offer 55 - II. 平衡二叉树(java解题)

leetcode《图解数据结构》剑指 Offer 55 - II. 平衡二叉树(java解题)的解题思路和java代码,并附上java中常用数据结构的功能函数。

剑指 Offer 64. 求 1 + 2 + … + n(java解题)

leetcode《图解数据结构》剑指 Offer 64. 求 1 + 2 + … + n(java解题)的解题思路和java代码,并附上java中常用数据结构的功能函数。

剑指 Offer 68 - I. 二叉搜索树的最近公共祖先(java解题)

leetcode《图解数据结构》剑指 Offer 68 - I. 二叉搜索树的最近公共祖先(java解题)的解题思路和java代码,并附上java中常用数据结构的功能函数。