题目描述:
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
今日学习:
1.复习树的结构
题解:
1.我自己想的,递归:中点设为根节点,中点左右数组的中点设为左右孩子
2.简化版,有些地方想复杂了
3.不用切割数组,用start和end双指针递归
关于为什么平衡参考:https://leetcode-cn.com/problems/balance-a-binary-search-tree/solution/jiang-er-cha-sou-suo-shu-bian-ping-heng-by-leetcod/
//我自己想的哈哈哈哈哈哈哈哈哈
var sortedArrayToBST = function(nums) {
//思路就是:中点设为根节点,中点左右数组的中点设为左右孩子
if(nums.length == 0) {return null}
if(nums.length == 1) {return new TreeNode(nums[0])}
let mid
if(nums.length % 2 == 0) {
mid = ((nums.length - 1) >> 1) + 1
}else {
mid = (nums.length - 1) / 2
}
let root = new TreeNode(nums[mid])
root.left = sortedArrayToBST(nums.slice(0, mid))
root.right = sortedArrayToBST(nums.slice(mid + 1))
return root
};
//简化版
var sortedArrayToBST = function(nums) {
let n = nums.length
if(n == 0) {return null}
let mid = Math.floor(n/2)
let root = new TreeNode(nums[mid])
root.left = sortedArrayToBST(nums.slice(0, mid))
root.right = sortedArrayToBST(nums.slice(mid + 1))
return root
};
//双指针递归
const sortedArrayToBST = (nums) => {
const buildBST = (nums, start, end) => {
if (start > end) return null;
const mid = (start + end) >>> 1;
const root = new TreeNode(nums[mid]);
root.left = buildBST(nums, start, mid - 1);
root.right = buildBST(nums, mid + 1, end);
return root;
};
return buildBST(nums, 0, nums.length - 1);
};