leetcode每天一题:【将有序数组转换为二叉搜索树】(简单)

785 阅读2分钟

这是我参与2022首次更文挑战的第30天,活动详情查看:2022首次更文挑战

题目描述

leetcode题目地址

给你一个有序的整数数组,然后需要你把这个整数数组转成高度平衡的二叉搜索树。

什么是高度平衡?

就是任意节点的左右子树的层级差的绝对值不超过 1,这样的二叉树就是高度平衡。

什么是二叉搜索树?

  • 左边树非空的情况下,左边树任意节点的值都要小于根节点的值
  • 右边树非空的情况下,右边树任意节点的值都要大于根节点的值
  • 左边树和右边树独立开也是二叉搜索树

举个例子(我的鬼画符绘画又要来了哦

高度平衡的二叉搜索树

image.png

高度平衡的二叉搜索树

image.png

不止一种答案,下面的两种也是高度平衡的二叉搜索树

image.png

image.png

高度平衡,但不是二叉搜索树,因为左边树的值大于根节点

image.png

是二叉搜索树,但不是高度平衡,相差超过1了 image.png

思路分析

递归

因为数组刚好是升序的整数数组,刚好可以满足二叉搜索树,我们取中间值,如果是奇数,就取中间的,如果是偶数,就取中间往前一位的。

然后把它左边的部分当作是左边树,右边的部分当作是右边树。这样子可以保证是高度平衡,数组长度相差不超过 1

然后因为数组是升序的,所以可以保证是二叉搜索树。

调用自身方法递归,

最后调用new TreeNode构建二叉树实例,返回的就是生成好的高度平衡的二叉树。

这里需要注意一下:

右边树的时候需要加一,因为需要跨过中间的根节点。

代码如下:

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {number[]} nums
 * @return {TreeNode}
 */
var sortedArrayToBST = function (nums) {
  if (!nums.length) return null
  const mid = parseInt(nums.length / 2)
  const leftNums = nums.slice(0, mid)
  const rightNums = nums.slice(mid + 1)
  const root = new TreeNode(nums[mid], sortedArrayToBST(leftNums), sortedArrayToBST(rightNums))
  return root
};

image.png