刷刷刷 Day 23 | 108. 将有序数组转换为二叉搜索树

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

LeetCode题目要求

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

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

图

示例

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

要构造一个二叉树,首先要找到 root 节点,题目要求构造的是个高度平衡的二叉树,那么从有序数组中找到 mid 索引,就可以构造出二叉搜索树,且在保证二叉搜索树特性的情况下,完成节点的构造。
假设根据 nums = [-10,-3,0,5,9],5 个节点来构造,进行二分,找到 root 节点 0,同时切分为 [-10, -3] 和 [5, 9] 两个子数组,接着来构造 root 的左右子节点,先看 [-10, -3] 这个子数组是左子树,且构造要符合二叉搜索树,这是需继续二分,直到剩余一个节点,才构造;[5, 9] 作为右子树做同样的操作

上代码

class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
// 左闭右开
return traversal(nums, 0, nums.length);
/**
索引 0 1 2 3 4
-10, -3, 0, 5, 9
递归,根据 nums 的 mid 索引找 root 节点,通过 nums 不断进行二分,完成左右节点构造,构造顺序为 中 左 右
0
/ \
-3 9
/ /
-10 5
*/
}
public TreeNode traversal(int[] nums, int start, int end) {
// 递归终止条件
if (end - start < 1) {
return null;
}
// 节点数等于 1 个时, 开始构造节点, 左闭右开
if (end - start == 1) {
return new TreeNode(nums[start]);
}
int mid = (start + end) / 2;
// 确定 root 节点 构造 root 节点
TreeNode root = new TreeNode(nums[mid]);
root.left = traversal(nums, start, mid);
root.right = traversal(nums, mid + 1, end);
return root;
}
}
重难点

找 root 节点,始终保持一个 左闭右开,或者左闭右闭的原则 对数组不断切分。直到剩下一个元素才构造节点。

附:学习资料链接

posted @   blacksonny  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示