LeetCode热题100--108. 将有序数组转换为二叉搜索树--简单
1. 题目
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。
示例 1:
输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:
示例 2:
输入:nums = [1,3]
输出:[3,1]
解释:[1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。
2. 题解
/*** Definition for a binary tree node.* 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;* }* }*/
class Solution {public TreeNode sortedArrayToBST(int[] nums) {return dfs(nums,0,nums.length - 1);}private TreeNode dfs(int[] nums, int lo, int hi){if(lo>hi){return null;}int mid = lo + (hi - lo) / 2;TreeNode root = new TreeNode(nums[mid]);root.left = dfs(nums,lo,mid - 1);root.right = dfs(nums,mid+1,hi);return root;}
}
3. 解析
出自:简单递归,🤷♀️ 必须秒懂!
// 定义二叉树节点类,包含整数值、左右子节点指针
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;}
}class Solution {// 主方法:接收有序数组,返回构建好的BST根节点public TreeNode sortedArrayToBST(int[] nums) {// 调用递归辅助方法,传入数组和初始边界(整个数组范围)return dfs(nums, 0, nums.length - 1);}// 递归方法:在子数组nums[lo..hi]范围内构建BSTprivate TreeNode dfs(int[] nums, int lo, int hi) {// 递归终止条件:当左边界超过右边界时返回空节点if (lo > hi) {return null;}// 计算中间索引(避免整数溢出的安全写法)int mid = lo + (hi - lo) / 2;// 以中间元素值创建根节点TreeNode root = new TreeNode(nums[mid]);// 递归构建左子树(左半部分数组)root.left = dfs(nums, lo, mid - 1);// 递归构建右子树(右半部分数组)root.right = dfs(nums, mid + 1, hi);// 返回当前构建完成的子树根节点return root;}
}