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;
    }
};
相关推荐
YUDAMENGNIUBI12 小时前
day20_逻辑回归
算法·机器学习·逻辑回归
澈20715 小时前
C++并查集:高效解决连通性问题
java·c++·算法
旖-旎17 小时前
深搜练习(单词搜索)(12)
c++·算法·深度优先·力扣
企客宝CRM18 小时前
2026年中小企业CRM选型指南:企客宝CRM处于什么位置?
android·算法·企业微信·rxjava·crm
橙淮18 小时前
二叉树核心概念与Java实现详解
数据结构·算法
米罗篮18 小时前
DSU并查集 & 拓展欧几里得-逆元
c++·经验分享·笔记·算法·青少年编程
橙淮18 小时前
双指针法:高效算法解题的利器
算法
初心未改HD19 小时前
深度学习之MLP与反向传播算法详解
人工智能·深度学习·算法
刀法如飞19 小时前
【Go 字符串查找的 20 种实现方式,用不同思路解决问题】
人工智能·算法·go