
平衡二叉树(全称:平衡二叉搜索树,也叫 AVL 树) = 一棵二叉搜索树 + 一个额外的平衡限制:
树中任意一个节点 的左子树高度 和 右子树高度 的差的绝对值,不能超过 1。
简单说:整棵树不能 "歪得太厉害",左右两边的高度差不多。
什么是 "二叉搜索树"?
你刚做的题就是这个,核心性质:
任意节点的左子树所有节点的值 都 < 该节点的值; 任意节点的右子树所有节点的值 都 > 该节点的值。
面试 100% 首选方法一:总是选择中间位置左边的数字作为根节点
核心思路(一句话讲透)
利用分治思想 :有序数组是二叉搜索树的中序遍历序列 ,要构建平衡二叉搜索树,只需要每次选数组中间的元素作为根节点,然后递归用左边的子数组构建左子树,右边的子数组构建右子树即可。
为什么选中间元素就能保证平衡?
- 选中间元素后,左右子树的节点数最多相差 1,自然满足平衡二叉树 "左右子树高度差不超过 1" 的要求
cpp
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
//辅助函数 用nums中的[left,right]区间的元素构建平衡BST
TreeNode* helper(vector<int>& nums,int left,int right){
if(left > right){
return nullptr;
}
int mid = (left + right) /2;
TreeNode* root = new TreeNode(nums[mid]);
//递归构建左子树:用左边的区间[left,mid-1]
root->left = helper(nums,left,mid-1);
//构建右子树
root->right = helper(nums,mid+1,right);
return root;
}
TreeNode* sortedArrayToBST(vector<int>& nums) {
return helper(nums,0,nums.size()-1);
}
};