【LeetCode刷题记录】29.最小高度树

116 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

题目来源:LeetCode-最小高度树

给定一个有序整数数组,元素各不相同且按升序排列,编写一个算法,创建一棵高度最小的二叉搜索树。

示例:

给定有序数组: [-10,-3,0,5,9],

一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:

          0 
         / \ 
       -3   9 
       /   / 
     -10  5

二、思路分析:

思路一: 容易证明当左右高度相同时候,高度最小

因为为升序,且二叉搜索树必须满足左小右大,所以取中间数作为根节点能构造出高度最小的数

选完根节点,数组被分成两部分

分别组成根节点的左右子树,由于两个子树互不影响,且其高度影响最终树的高度,所以应该使得两颗子树高度都最小

  1. 问题规模小时(l==r): return new TreeNode(nums[l]);

  2. 问题规模大时:

    1.取出中间节点作为根节点

    2.构成高度最小的二叉搜索树做左子树

    3.构成高度最小的二叉搜索树做右子树

思路二: sortedArrayToBST方法是传入一个数组

取数组中间的数建立根节点root

以中间为分界,将左边的子数组和右边的子数组分别传入sortedArrayToBST进行递归

返回的是左子树和右子树的根节点,令其等于root.left和root.right即可:

三、AC 代码:

思路一:

    class Solution {
        public TreeNode sortedArrayToBST(int[] nums) {
            return genBST(nums, 0, nums.length - 1);
        }

        public static TreeNode genBST(int[] nums, int start, int end) {
            if (start > end) return null;
            int midValue = start + (end - start) / 2;
            TreeNode rootNode = new TreeNode(nums[midValue]);
            rootNode.left = genBST(nums, start, midValue - 1);
            rootNode.right = genBST(nums, midValue + 1, end);
            return rootNode;
        }
    }

思路二:

    class Solution {
        public TreeNode sortedArrayToBST(int[] nums) {
            if (nums.length == 0) return null;
            TreeNode result = new TreeNode(nums[nums.length / 2]);
            result.left = sortedArrayToBST(Arrays.copyOfRange(nums, 0, nums.length / 2));
            result.right = sortedArrayToBST(Arrays.copyOfRange(nums, nums.length / 2 + 1, nums.length));
            return result;
        }
    }