将一个按照升序排序的有序数组,转换为一颗高度平衡二叉搜索树。
一个高度平衡二叉树又称为AVL树是指一个二叉树每个节点的左右两个子树的高度的绝对值不超过1
例如:
[-10, -3, 0, 5, 9]
一个可能的答案是:[0, -3, 9, 10, null, 5]
,它可以表示下面这个高度平衡二叉搜索树
0
/ \
-3 9
/ /
-10 5
AVL树又称为高度平衡的二叉搜索树。它能保持二叉树的高度平衡,尽量降低二叉树的高度,减少树的平均搜索长度。
AVL树性质:
- 左子树和右子树的高度之差的绝对值不超过1
- 树中的每个左子树和右子树都是AVL树
- 每个节点都有一个平衡因子(balance factor–bf),任一节点的平衡因子是-1,0,1. (每个节点的平衡因子等于右子树的高度减去左子树的高度)
由于AVL树要求左右子树高度差的绝对值不超过,因此AVL树必须通过旋转调平衡因子保持平衡。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
return sortedArrayToBST(nums, 0, nums.size()-1);
}
TreeNode* sortedArrayToBST(vector<int>& nums, int left, int right) {
int len = right - left + 1;
if(len == 0) return nullptr;
int mid = (right + left)/2;
TreeNode *root = new TreeNode(nums[mid]);
if(len == 0) return root;
root -> left = sortedArrayToBST(nums, left, mid-1);
root -> right = sortedArrayToBST(nums, mid+1, right);
return root;
}
};