力扣HOT100(46)将有序数组转换为二叉搜索树

平衡二叉树(全称:平衡二叉搜索树,也叫 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);
    }
};
相关推荐
lzhdim4 小时前
AI的分类
人工智能·算法·机器学习·分类·数据挖掘
凤凰院凶涛QAQ7 小时前
《Java版数据结构 & 集合类剖析》Map & Set & 反射:“从哈希碰撞到红黑树转换,反射帮你扒开 HashMap 的桶数组看个究竟”
java·数据结构·算法
w_zero_one9 小时前
算法--模拟
java·数据结构·算法
秋天的怀念_David9 小时前
算法一千零一夜 · 第十三夜 幻方,武侠世界里的数学迷宫
java·程序人生·算法
lll235269177910 小时前
HR如何快速整理面试沟通内容?
面试·职场和发展
零售校长10 小时前
西湖区零售门店店长面试怎么准备
面试·职场和发展·零售
秋天的怀念_David10 小时前
算法一千零一夜 · 第十四夜 幻方与奇妙的二进制
java·程序人生·算法
薛定e的猫咪10 小时前
(ICLR 2020)MAML 靠的不是快速学习,而是特征复用
人工智能·深度学习·学习·算法·机器学习
薛定e的猫咪11 小时前
(ICLR 2026)DF-META:面向 FJSP 的无导数元学习实例自适应调度
人工智能·深度学习·学习·算法·机器学习
java_nnnn12 小时前
LeetCode刷题滑动窗口(水果成篮+找到字符串中所有字母的异位词)Java
java·开发语言·leetcode