题目:
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
给定有序数组: [-10,-3,0,5,9],
一个可能的答案是:[0,-3,9,-10,null,5],
它可以表示下面这个高度平衡二叉搜索树:
0
/ \
-3 9
/ /
-10 5
即:把数组按二分法拆分区间,再把区间拼接成树
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {number[]} nums
* @return {TreeNode}
*/
var sortedArrayToBST = function (nums) {
if (!nums) {
return null;
}
let node = new TreeNode();
return buildTree(nums, node);
function buildTree(arr, node) {
let len = arr.length
if (len === 0) return null;
let mid = parseInt(len / 2, 10);
node.val = arr[mid];
let left = [];
for (let i = 0; i < mid; i++) {
left.push(arr[i]);
}
if (left.length > 0) {
node.left = new TreeNode();
buildTree(left, node.left);
}
let right = [];
for (let i = mid + 1; i < arr.length; i++) {
right.push(arr[i]);
}
if (right.length) {
node.right = new TreeNode();
buildTree(right, node.right);
}
return node;
}
};
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {number[]} nums
* @return {TreeNode}
*/
var sortedArrayToBST = function(nums) {
return build(nums, 0, nums.length - 1)
function build(nums, left, right) {
if (left > right) return null
let mid = parseInt((left + right) / 2, 10);
let node = new TreeNode(nums[mid])
node.left = build(nums, left, mid - 1)
node.right = build(nums, mid + 1, right);
return node;
}
};