前端算法(64)

61 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目

给你一个整数数组 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;
};