【刷题笔记】108. 将有序数组转换为二叉搜索树

102 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情

一、题目描述:

108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode) (leetcode-cn.com)

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

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

示例 1:

image.png

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

image.png

示例 2:

image.png

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

提示:

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

二、思路分析:

最开始想到的思路是按照常规方法建树,这个思路不好,非常麻烦,而且代码还难写。

当然,和完整版建树不同的是,由于本题目中的数字全是递增的,所以只涉及到在有子树的右侧添加,即RR类型的调整,不用写LL,LR和RL类型的调整。

高度要取左右子树高度的较大者再加一,RR调整是将右子节点变成根节点,根节点变为右子节点的左节点,然后将右子节点的左子树接到根节点的右子树上去。

三、AC 代码:

class Solution {
    private static TreeNode root;
    public TreeNode sortedArrayToBST(int[] nums) {
        root = null;
        int n = nums.length;
        if(n == 0) return null;
        for(int i = 0 ; i < n; i ++) root = add(nums[i], root);
        return root;
    }
    public static TreeNode add(int x, TreeNode root) {
        if(root == null) return new TreeNode(x, null, null);
        if(x < root.val) root.left = add(x, root.left);
        else if(x > root.val) root.right = add(x, root.right);
        //要特别注意上面这两步,因为递归处理的过程中,子树的根节点也是有可能会发生改变的!
        else return root;
        if(Math.abs(height(root.left) - height(root.right)) > 1) root = judge(root);
        return root;
    }
    public static int height(TreeNode root) {
        if(root == null) return 0;
        else return (Math.max(height(root.left), height(root.right)) + 1);
    }
    public static TreeNode judge(TreeNode root) {
        TreeNode t = root.right;
        root.right = t.left;
        t.left = root;
        return t; 
    }
}