leetcode-中等题-654. 最大二叉树

https://leetcode-cn.com/problems/maximum-binary-tree/
这道题比构造二叉树简单了一半,因为只需要两个指针来指定新数组就行了。
这次还优化了一下代码,把遍历变少了,具体看第二版。

//  区间定义:左闭右开
//  传入参数:(nums, 左指针, 右指针)
//  返回 TreeNode
//  终止条件:
//  1. 左指针等于右指针,即没有数,返回null
//  2. 右指针 - 左指针 == 1, 只有一个参数,返回叶子节点
//  内部逻辑:
//  1. for循环找出maxnum,区间在两个指针之间
//  2. 划分左右区间
//  3. 获取左区间,root.left = traverse(nums, leftIndex, rightIndex)
//  4. 获取右区间,root.right = traverse(nums, leftIndex, rightIndex)
//  5. return root;

class Solution {
    public TreeNode constructMaximumBinaryTree(int[] nums) {
        int leftIndex = 0;
        int rightIndex = nums.length;
        return traverse(nums, leftIndex, rightIndex);
    }
    public TreeNode traverse(int[] nums, int leftIndex, int rightIndex){
        if(rightIndex - leftIndex == 0) return null;
        TreeNode root;
        int lastone = rightIndex;//保留右指针的位置
        if(rightIndex - leftIndex == 1) return new TreeNode(nums[leftIndex]);
        //size大于1的数组
        int maxnum = leftIndex;
        // System.out.println("leftIndex : "  + leftIndex);
        for(int i = leftIndex; i < rightIndex; i++){
            maxnum = nums[maxnum] > nums[i] ? maxnum : i;
        }
        // System.out.println("maxnum : "  + maxnum);
        root = new TreeNode(nums[maxnum]);
        //左区间
        rightIndex = maxnum;
        root.left = traverse(nums, leftIndex, rightIndex);
        //右区间
        leftIndex = maxnum + 1;
        rightIndex = lastone;
        root.right = traverse(nums, leftIndex, rightIndex);
        return root;
    }
}

改善后的代码:

class Solution {
    public TreeNode constructMaximumBinaryTree(int[] nums) {
        return traverse(nums, 0, nums.length);
    }
    public TreeNode traverse(int[] nums, int leftIndex, int rightIndex){
        if(rightIndex - leftIndex == 0) return null;
        TreeNode root;
        if(rightIndex - leftIndex == 1) return new TreeNode(nums[leftIndex]);
        //size大于1的数组
        int maxnum = leftIndex;
        for(int i = leftIndex; i < rightIndex; i++){
            maxnum = nums[maxnum] > nums[i] ? maxnum : i;
        }
        root = new TreeNode(nums[maxnum]);
        //左区间
        root.left = traverse(nums, leftIndex, maxnum);
        //右区间
        root.right = traverse(nums, maxnum + 1, rightIndex);
        return root;
    }
}

你可能感兴趣的:(算法,leetcode,算法)