leetcode 108 有序数组转平衡二叉树

这个题乍一看真的没什么思路,因为平衡二叉树自古以来就是老大难问题,如何建立的时候就平衡,这需要一些贪心的思想。

这个题目的官方题解写的非常好,这个题其实是一个不断二分的过程,每次找中间节点,左边的分到左子树,右边的分到右子树,一致这样递归二分下去即可。但是如果一直是奇数节点还好说,如果出现偶数节点呢?我们应该选择左边还是右边的节点?

这个就是一种贪心思想,答案是怎么选都无所谓,都可以让这棵树尽可能的平衡。

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) {}
 * };
 */
typedef vector<int> V;

class Solution {
public:
    TreeNode* dfs(V& nums, int l, int r)
    {
        if(l > r)return nullptr;
        int mid = l + (r-l)/2;
        TreeNode *n = new TreeNode(nums[mid]);
        n->left = dfs(nums, l, mid-1);
        n->right = dfs(nums, mid+1, r);
        return n;
    }

    TreeNode* sortedArrayToBST(vector<int>& nums) {
        int n = nums.size();
        int mid = 0 + (n-1)/2;
        TreeNode *root = new TreeNode(nums[mid]);
        root->left = dfs(nums, 0, mid-1);
        root->right = dfs(nums, mid+1, n-1);
        
        return root;
    }
};
相关推荐
数模竞赛Paid answer18 小时前
2026年五一杯数学建模C题边坡预警问题求解全过程文档及程序
算法·数学建模·五一杯
hold?fish:palm18 小时前
20 旋转图像
c++·算法·leetcode
NoteStream19 小时前
【C语言基础】分支和循环(上)
c语言·开发语言·c++·经验分享·笔记·算法·c#
白狐_79819 小时前
408数据结构第7章:查找②——顺序、折半、分块查找秒杀 + 真题
数据结构·算法
卷心菜的学习路19 小时前
基于多模态向量检索的数学相似题推荐系统:完整设计、算法与实验
java·python·算法·大模型·推荐算法·数学相似题
向阳而生自媒体19 小时前
2026年MBA面试自我介绍怎么说?3分钟/5分钟版本怎么准备?
面试·职场和发展
小南知更鸟19 小时前
【leetcodehot100】leetcode-hot100-20260809更新
算法·leetcode·职场和发展
数模竞赛Paid answer19 小时前
2021年深圳杯数学建模A题火星探测器着陆控制方案解题全过程论文及程序
算法·数学建模·深圳杯
hold?fish:palm20 小时前
19 螺旋矩阵
线性代数·算法·矩阵
码完就睡20 小时前
数据结构——树、二叉树基础概念
数据结构·算法