问题:
Given an array where elements are sorted in ascending order, convert it to a height balanced BST.
这个问题要求我们生成一个平衡二叉树。
直接生成AVL树是比较困难的,
需要不断地判断是否需要进行旋转相关的工作。
但如果输入是一个排序数组的话,就相对比较容易了。
由于AVL树需要保证左、右子树的深度差不超过1,
因此就是要保证左、右子树的节点数量几乎相等。
于是我们可以用排序数组的中间节点作为根节点,
分别得到AVL的左、右子树。
代码示例:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
//判断参数的有效性
if (nums == null || nums.length == 0) {
return null;
}
//递归得到整个AVL树,初始范围为整个数组
return innerHelper(nums, 0, nums.length-1);
}
private TreeNode innerHelper(int[] nums, int begin, int end) {
if (begin > end) {
return null;
}
//每次取中间节点为根节点
int mid = (begin + end) / 2;
TreeNode root = new TreeNode(nums[mid]);
//用根节点的左侧的数生成左子树
root.left = innerHelper(nums, begin, mid-1);
//用根节点的右侧的数生成右子树
root.right = innerHelper(nums, mid+1, end);
return root;
}
}