题目如下:
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定有序数组: [-10,-3,0,5,9],
一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:
0
/ \
-3 9
/ /
-10 5来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
本题较为简单,一开始没看明白题意,依旧是看完题解后根据原理实现。
无需纠结唯一解,高度差的绝对值不超过1,即每个节点的左右两个子树的所有子节点数量相差不超过1。
所以,每次输入节点的时,保证当前节点在子数组(包含自身和所有子节点的数组)的中间位置,这样每次输入节点的子节点都是左右平衡。
由于数组长度的奇偶不同,可能在最末端的节点会出现1的高度差,但同样满足题中不超过1的差值。
题解中分别用三种方式选择节点插入位置,原理大同小异,此处只实现节点在中间位置左边的方式。
二叉树基本使用递归实现。
复杂度分析引用力扣题解:
以下为代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* public int val;
* public TreeNode left;
* public TreeNode right;
* public TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public TreeNode SortedArrayToBST(int[] nums) {
return BSTHelper(nums,0,nums.Length - 1);
}
private TreeNode BSTHelper(int[] nums,int left,int right)
{
if (left > right)
{
return null;
}
int mid =(left + right) / 2;
TreeNode root = new TreeNode(nums[mid]);
root.left = BSTHelper(nums,left,mid - 1);
root.right = BSTHelper(nums,mid + 1,right);
return root;
}
}
需要注意一点,由于使用递归,如果不先使用临时的 int 变量存储中间位置的下标,在接下来的三次调用都使用表达式,会使计算时间明显增多。