將一個按照升序排序的有序數組,轉換爲一顆高度平衡二叉搜索樹。
一個高度平衡二叉樹又稱爲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;
}
};