本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题目
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。
高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。
输入: nums = [-10,-3,0,5,9]
输出: [0,-3,9,-10,null,5]
题目解析
思路一
我们以中间元素为根结点,将数组做成树,如果数组中元素为奇数个,此时以数组的中间元素为界,两侧元素个数相同,如果数组中元素为偶数个,此时无论是选择中间靠左的元素为界、还是选择中间靠右的元素为界,两侧元素个数差值的绝对值都是1,接下来我们来实现下,我们先 处理边界条件,然后定义二叉树构建函数,入参是子序列的索引范围,当low > high时,意味着当前范围的数字已经被递归处理完全了,使用二分,取出当前子序列的中间元素,在将将中间元素的值作为当前子树的根节点值,进行递归构建左子树,范围二分为[low, mid)和递归构建右子树,范围二分为(mid, high],最后返回当前节点
/**
* @param {number[]} nums
* @return {TreeNode}
*/
var sortedArrayToBST = function(nums) {
if(!nums.length) return null;
function buildBST(low, high) {
if(low > high) return null;
const mid = Math.floor(low + (high - low) / 2);
const cur = new TreeNode(nums[mid]);
cur.left = buildBST(low, mid - 1);
cur.right = buildBST(mid + 1, high);
return cur;
}
const root = buildBST(0, nums.length - 1);
return root;
};
思路二
有序数组的中间元素为中间节点,将该节点存为root,并且记录该节点的序号,将其一分为二做递归来求解左右子节点的值。
/**
* @param {number[]} nums
* @return {TreeNode}
*/
var sortedArrayToBST = function(nums) {
if(!nums.length){return null}
var mid = Math.floor(nums.length/2)
var root = new TreeNode(nums[mid])
root.left = sortedArrayToBST(nums.slice(0,mid))
root.right = sortedArrayToBST(nums.slice(mid+1))
return root;
};