福建省建设相关网站百度搜索引擎广告位的投放
108. 将有序数组转换为二叉搜索树
分析
给定一个有序数组,要求转换为二叉搜索树。
数组是有序的,并且要求二叉树。
这里看到数组是有序的,马上想到二分,但是又不需要完全二分 实现。
再复习二叉搜索树的结构特点:
左边节点的值 < 中间节点的值
left < mid
中间节点的值 < 右节点的值
mid < right
看到这种情况,可以让计算机来帮助我们处理左右半边的节点。
于是,我们可以用递归来进行处理。
递归
-
先递归找到中间节点mid的下标
即mid = left + right >> 1
-
再将
root
指向nums[mid]
-
接着递归处理左半边
即root.left = fun(nums , left , mid - 1)
-
再递归处理右半边
即root.right = fun(nums , mid + 1 , right)
这里很多小伙伴会疑惑为什么这样就可以AC,因为递归到最后的基元情况都是只有一个节点即根节点,不过是依次每次处理好每一层的根节点罢了。
注意
递归要对边界条件进行判断处理
当数组下界下标大于数组上界下标时,返回空,这种情况非法。
ACcode
/*** 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 helper(nums , 0 , nums.length - 1);}public TreeNode helper (int nums[] , int left , int right){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;}
}
喜欢的小伙伴点点关注,我们下期再见✌️