【LeetCode】108.将有序数组转换为二叉搜索树


1 问题

给你一个整数数组 nums ,其中元素已经按升序排列,请你将其转换为一棵高度平衡二叉搜索树

高度平衡二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。

示例 1

示例1

输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:

示例1结果

示例 2

示例2

输入:nums = [1,3]
输出:[3,1]
解释:[1,null,3] 和 [3,1] 都是高度平衡二叉搜索树

提示

  • 1 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums 按严格递增顺序排列

2 解题思路

二叉树结构:

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;
    }
}

题目中醒目给出数组是严格递增的,也就是数组不存在相同的元素且升序排列。立马应该想到二分法递归解决此类问题。

高度平衡二叉搜索树要求结果不能随意是一个二叉树,因此再构造的时候,

  • 当前节点的左子树所有节点的元素值一定是严格小于当前节点的值;
  • 其右子树所有节点的元素值一定是严格大于当前节点的值。

我们可以结合题目给定的严格递增条件,轻松解决:

  • 定义构造BST的方法为:TreeNode createBST(int[] nums, int start, int end);,其中nums是题目已知的数组,start表示子树的起始位置,end则表示子树的结束位置;
  • 选择数组中间节点为根节点:TreeNode root = new TreeNode(nums[mid]);
  • root.left=createBST(nums, start, mid - 1);,递归解决当前节点左子树构造问题,限定了左子树的范围是在数组索引[start, mid-1]的范围;
  • 同理,root.right = createBST(nums, mid + 1, end);,解决其右子树构造问题,其右子树在数组的范围是[mid+1, end]

3 代码

class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        //二分法(提示了 严格递增数组)
        return createBST(nums, 0, nums.length - 1);
    }

    private TreeNode createBST(int[] nums, int start, int end) {
        if (start > end) {
            return null;
        }
        int mid = start + (end - start) / 2;
        //build a root
        TreeNode root = new TreeNode(nums[mid]);
        root.left = createBST(nums, start, mid - 1);
        root.right = createBST(nums, mid + 1, end);
        return root;
    }
}

文章作者: Kezade
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Kezade !
评论
  目录