前端算法-将有序数组转换为二叉搜索树

106 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第28天,点击查看活动详情

题目

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。

高度平衡二叉树是一棵满足每个节点的左右两个子树的高度差的绝对值不超过1的二叉树。

输入: nums = [1,3]
输出: [3,1]
解释: [1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。

题解

这道题我们采用中序遍历递归的方式实现,我们在进入函数中先判断当前出参nums的长度是否为0,如果为0则直接返回null,接下来定义个dfs函数,此函数接受三个入参,分别是数据nums,左节点位置left,右节点位置right,在函数中我们判断一下当前的出参left是否大于出参right如果是则直接返回null,接下来我们声明一个mid变量,我们使用Math函数中的floor方法将出参left加上出参right减去出参left的值除以2的值,进行向下取整,得出中位数,然后在声明一个root变量,它是使用TreeNode(nums[mid])创建出来的节点,接下来调用自身传入对应参数进行执行并将返回结果赋值给root变量的左子树,root变量的右子树赋值与root变量的左子树赋值操作一样只不过传入参数需要变动,在将root变量返回出去,最后调用dfs方法将所需参数传递进去,将dfs方法执行后的返回结果直接返回

/**
 * @param {number[]} nums
 * @return {TreeNode}
 */
var sortedArrayToBST = function(nums) {
  if (nums.length === 0) return null;
    let dfs = (nums, left, right) => {
        if (left > right) return null;
        let mid = Math.floor(left + (right - left) / 2);
        let root = new TreeNode(nums[mid]);
        root.left = dfs(nums, left, mid - 1);
        root.right = dfs(nums, mid + 1, right);
        return root;
    }
    return dfs(nums, 0, nums.length - 1);
};

坚持努力,无惧未来!