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

题目描述

题干:
给你一个整数数组 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,3] 和 [3,1] 都是高度平衡二叉搜索树。


题解思路

这道题考察的是平衡二叉排序树,本来感觉平衡二叉树就有点棘手,还得排序就很难受,可是好在他给你了升序的条件

因为升序的原因,所以只要中间数字为根节点,这样递归遍历下去肯定是平衡的二叉排序树

正因如此,所以说答案会因为中间数字的不同和不同的算法答案也尽不相同,所以说官方题解给了很多种不同根的算法

这里选择了最容易理解的中间或者中间左第一个元素作为根节点的代码,只要明白代码含义,是很好理解的

正确代码

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

    private TreeNode helper(int[] nums, int left, int right) {
        //因为升序排序,所以当左边元素小于右边元素时就可以停止递归返回null
        if (left > right) return null;
        
        //节点保证是中间或者中间左边第一个元素
        int mid = (left + right) / 2;

        //左右两边都递归遍历,最后返回根节点
        TreeNode root = new TreeNode(nums[mid]);
        root.left = helper(nums,left,mid-1);
        root.right = helper(nums,mid+1,right);
        return root;
    }

总结

一旦牵扯到树代码就对自己来说就很难独立完成,确实是理解和输出是两码事

这道题归根结底来说还是深度优先遍历的思想,只不过套了个平衡二叉树的壳子,但是下次遇到让平衡的时候不知道自己是否可以单独完成

官方题解的另外两种方法其实思想上差别不大,只不过换了个根节点,有兴趣的你可以去看一看,说不定就会有额外的收获

文章如果存在问题或者有更好的题解,希望大佬斧正和评论,各自努力,你我最高处见
posted @ 2021-03-07 11:11  21岁还不是架构师  阅读(77)  评论(0)    收藏  举报