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

 

package 二叉树.二叉搜索树;

/**
* https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/
*
* @author Huangyujun
* 升序数组 转成高度平衡的二叉树(不断的new 结点),需要经过对比:高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。
* 升序对应升序的话,就是 小的在左边,大的在右边(这次要求大的力度是比原来左边大(小于等于1),否则,这个点null了,)题意应该将不超过改成不小于才是官网的解法呀
*
* 题意:
* 每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。
* 然后官网的解法就是只是单纯把升序数组转成一颗平衡二叉树,我的天,我觉得官网的理解的题意有bug,此题理解点“每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。”是个问题
*/
public class _108_将有序数组转换为二叉搜索树 {
// public TreeNode sortedArrayToBST(int[] nums) {
// TreeNode root = new TreeNode(nums[0]);
// int n = nums.length;
// TreeNode node = root;
// for(int i = 1; i < n; i++) {
// if(nums[i] <= nums[i - 1]) { //小于等于前一个结点,作为左子树
// TreeNode left = new TreeNode(nums[i]);
// node.left = left;//需要同步 结点往下跑
// node = node.left;
// }else { //看看,有没有机会做人家的右边(比较大的值)
// //比较前提是人间有了左子树呀
// if(node.left == null) { //直接放到右边
// TreeNode right = new TreeNode(nums[i]);
// node.right = right;
// node = node.right;
// }else if(Math.abs(nums[i] - node.left.val) <= 1) {
// TreeNode right = new TreeNode(nums[i]);
// node.right = right;//需要同步 结点往下跑
// node = node.left;
// }else {
// node.right = null;//需要同步 结点往下跑
// node = node.left;
// }
// }
// }
// return root;
// }

//官网答案:
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;
}
}

}

 


作者:一乐乐​