美文网首页
LeetCode 654. 最大二叉树

LeetCode 654. 最大二叉树

作者: 陈陈chen | 来源:发表于2021-08-31 16:48 被阅读0次

    1、题目

    image.png

    2、分析

    大神曾经说过,递归算法,其实就是把题目的要求细化,搞清楚根节点应该做什么,然后剩下的事情抛给前/中/后序的遍历框架就行了

    3、我自己的代码:

    /**
     * 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 constructMaximumBinaryTree(int[] nums) {
            int maxIndex = getMaxIndex(nums); //查找最大值
            if (maxIndex == -1) return null;
            int length = nums.length;
            int[] leftNums = new int[maxIndex];
            int[] rightNums = new int[length - maxIndex - 1];
            for (int i = 0; i < maxIndex; i ++){
                //把左边的数组重新赋值
                leftNums[i] = nums[i];
            }
            int j = 0;
            for (int i = maxIndex + 1; i < length; i++){
                //把右边的数组重新赋值
                rightNums[j] = nums[i];
                j++;
            }
            //递归构造
            TreeNode left = constructMaximumBinaryTree(leftNums);
            TreeNode right = constructMaximumBinaryTree(rightNums);
            TreeNode node = new TreeNode(nums[maxIndex], left, right);
            return node;
        }
    
        private int getMaxIndex(int[] nums){
            int tmp = 0;
            int index = 0;
            int length = nums.length;
            if (length == 0) return -1;
            for(int i = 0; i < length; i ++){
                if (nums[i] > tmp){
                    tmp = nums[i];
                    index = i;
                }
            }
            return index;
        }
    }
    

    某大神的代码,这样占用内存空间比较少。因为我还需要给左右子树的数组重新赋值。看看大神代码:

    /**
     * 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 constructMaximumBinaryTree(int[] nums) {
            return build(nums, 0, nums.length - 1);
        }
    
        private TreeNode build(int[] nums, int lo, int hi){
            if (lo > hi) return null;
            int maxVal = Integer.MIN_VALUE;
            int index = -1;
            for(int i = lo; i <= hi; i ++){
                if (nums[i] > maxVal){
                    maxVal = nums[i];
                    index = i;
                }
            }
            TreeNode root = new TreeNode(maxVal);
            root.left = build(nums, lo, index - 1);
            root.right = build(nums, index + 1, hi);
            return root;
        }
    }
    

    大神的解析:
    https://mp.weixin.qq.com/s/OlpaDhPDTJlQ5MJ8tsARlA

    相关文章

      网友评论

          本文标题:LeetCode 654. 最大二叉树

          本文链接:https://www.haomeiwen.com/subject/fbpziltx.html