Leetcode每日一题--108.将有序数组转换为二叉搜索树

69 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第18天,点击查看活动详情

前言

算法的重要性不言而喻!区分度高!

现在学习的门槛低了,只有能上网每个人都可以学编程!培训班6个月就可以培养出来能干活的人,你怎么从这些人中脱颖而出?没错!就是学算法,学一些底层和基础的东西。

说的功利点是为了竞争,卷死对手。真心话说就是能提高自己的基础能力,为技术可持续发展做好充分的准备!!!

提前入门学习书籍:CPrimerPlus、大话数据结构

image-20220705103735001

刷题网站

代码随想录 (programmercarl.com)

leetcode

我是按照代码随想录提供的刷题顺序进行刷题的,大家也可以去刷leetcode最热200道,都可以

刷题嘛,最重要的就是坚持了!!!

画图软件

OneNote

这个要经常用,遇见不懂的流程的话就拿它画一画!

笔记软件

Typoral

题目

力扣题目链接

解析

这里和之前写的构造二叉树也是一样的思路,本质上就是对数组寻找分割点,分割作为当前节点,然后递归左区间和右区间。

而且呢,有序数组分割起来也是比较容易的,因为是有序的嘛,那么分割点就是中间节点!

当然如果数组中的数字是偶数个的话,选用哪个节点作为中间节点呢?

选择哪个都没有关系,只不过是构造出来的二叉树不同罢了,如下图:

image.png

递归三部曲

  1. 确定递归的参数和返回值

递归的参数为数组,我们之前了解过在构造二叉树的时候尽量不要重新定义左右区间数组,而是用下标来操作原数组。

返回值为构造出来的二叉搜索树,所以返回值是TreeNode

public TreeNode sortedArrayToBST(int[] nums, int left, int right) {
  1. 确定递归终止的条件

终止条件要满足,循环不变量原则

这里我用的是左闭右开区间


if (left >= right) {
    return null;
}

  1. 确定单层递归的逻辑

这里就和之前的很相似了

  1. 通过left去接受递归的左子树

  2. 通过right去接收递归得到的右子树

最后返回根节点就可以得到我们构造出来的二叉搜索树


int mid = left + (right - left) / 2;
TreeNode root = new TreeNode(nums[mid]);
root.left = sortedArrayToBST(nums, left, mid);
root.right = sortedArrayToBST(nums, mid + 1, right);
return root;

完整代码

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