一、需求
- 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
- 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定有序数组: [-10,-3,0,5,9],
一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:
0
/ \
-3 9
/ /
-10 5
二、中序遍历+二分
2.1 思路分析
- 该算法利用了中序遍历和二分法的思想,给定一个排序数组,首先得找到根节点,根据中序遍历思想可以知道,根节点就是排序数组中中间的位置,那么要获得一个数组中间元素的索引,可以利用二分思想;
- 有了根节点后,利用递归建立其左子树和右子树;
2.2 代码实现
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
if(nums == null || nums.length == 0) return null;
return helper(nums, 0, nums.length - 1);
}
private TreeNode helper(int[] nums, int i, int j) {
if(i > j) return null;
int m = (i + j) / 2;
TreeNode root = new TreeNode(nums[m]);
root.left = helper(nums, i, m - 1);
root.right = helper(nums, m + 1, j);
return root;
}
}
2.3 复杂度分析
- 时间复杂度为O(N),要建立二叉搜索树需要遍历所有的数组元素;
- 空间复杂度为
,递归的最大深度可达
;
这篇博客介绍了如何使用中序遍历和二分法将一个有序数组转化为高度平衡的二叉搜索树。算法首先找到数组中间元素作为根节点,然后递归地构建左子树和右子树。时间复杂度为O(N),空间复杂度为O(logN)。

1297

被折叠的 条评论
为什么被折叠?



