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; } } }