这是我参与2022首次更文挑战的第30天,活动详情查看:2022首次更文挑战
题目描述
给你一个有序的整数数组,然后需要你把这个整数数组转成高度平衡的二叉搜索树。
什么是高度平衡?
就是任意节点的左右子树的层级差的绝对值不超过 1,这样的二叉树就是高度平衡。
什么是二叉搜索树?
- 左边树非空的情况下,左边树任意节点的值都要小于根节点的值
- 右边树非空的情况下,右边树任意节点的值都要大于根节点的值
- 左边树和右边树独立开也是二叉搜索树
举个例子(我的鬼画符绘画又要来了哦)
高度平衡的二叉搜索树
高度平衡的二叉搜索树
不止一种答案,下面的两种也是高度平衡的二叉搜索树
高度平衡,但不是二叉搜索树,因为左边树的值大于根节点
是二叉搜索树,但不是高度平衡,相差超过1了
思路分析
递归
因为数组刚好是升序的整数数组,刚好可以满足二叉搜索树,我们取中间值,如果是奇数,就取中间的,如果是偶数,就取中间往前一位的。
然后把它左边的部分当作是左边树,右边的部分当作是右边树。这样子可以保证是高度平衡,数组长度相差不超过 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
};