BM40 题解 | #重建二叉树#

重建二叉树

https://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6

解题心得:

1、一个要清楚什么时候停止创建TreeNode,就是pre.size() ,vin.size()都为空时;

2、一个是要注意下标的选取,容易选错导致整个算法异常,只要对着笔记本上画出来的标识来看就没有任何问题!

            root.left = reConstructBinaryTree(
                Arrays.copyOfRange(preOrder, 1, i+1), 
                Arrays.copyOfRange(vinOrder, 0, i));
            root.right = reConstructBinaryTree(
                Arrays.copyOfRange(preOrder, i+1, n),
                Arrays.copyOfRange(vinOrder, i+1, n));

解题思路:

1、判断传入的pre、vin数组长度是否为0,若是返回null

2、创建新的根节点,

3、for循环找出根节点,在中序数组的位置,截取左右子节点的pre、vin数组递归,

4、最后返回整个root节点。

import java.util.*;


public class Solution {
    /**
     *  根据前序、中序数组重构二叉树
     * @param preOrder int整型一维数组 
     * @param vinOrder int整型一维数组 
     * @return TreeNode类
     */
    public TreeNode reConstructBinaryTree (int[] preOrder, int[] vinOrder) {
        // 前序和中序数组为空说明到叶子节点底了
        // 直接返回空节点填充叶子节点的叶子
        int m = preOrder.length;
        int n = vinOrder.length;
        if(m == 0 || n == 0) {
            return null;
        }
        // 创建根节点
        TreeNode root = new TreeNode(preOrder[0]);
        for(int i=0; i<n; i++) {
            // 找到左右子节点的前序、中序数组递归
            if(preOrder[0]==vinOrder[i]) {
                root.left = reConstructBinaryTree(
                    Arrays.copyOfRange(preOrder, 1, i+1), 
                    Arrays.copyOfRange(vinOrder, 0, i));
                root.right = reConstructBinaryTree(
                    Arrays.copyOfRange(preOrder, i+1, n),
                    Arrays.copyOfRange(vinOrder, i+1, n));
                break;
            }
        }
        return root;
    }
}
全部评论

相关推荐

03-03 23:12
已编辑
北京邮电大学 Java
书海为家:我来给一点点小建议,因为毕竟还在学校不像工作几年的老鸟有丰富的项目经验,面试官在面试在校生的时候更关注咱们同学的做事逻辑和思路,所以最好在简历中描述下自己做过项目的完整过程,比如需求怎么来的,你对需求的解读,你想到的解决办法,遇到困难如何找人求助,最终项目做成了什么程度,你从中收获了哪些技能,你有什么感悟。
你的简历改到第几版了
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务