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;
    }
};
相关推荐
灵感__idea3 小时前
Hello 算法:“走一步看一步”的智慧
前端·javascript·算法
lwf0061644 小时前
导数学习日记
学习·算法·机器学习
头发够用的程序员5 小时前
从滑动窗口到矩阵运算:img2col算法基本原理
人工智能·算法·yolo·性能优化·矩阵·边缘计算·jetson
武帝为此6 小时前
【数据清洗缺失值处理】
python·算法·数学建模
Halo_tjn6 小时前
Java 基于字符串相关知识点
java·开发语言·算法
念越6 小时前
算法每日一题 Day08|双指针法解决三数之和
算法·力扣
黎阳之光7 小时前
黎阳之光透明管理:视频孪生重构智慧仓储新范式
人工智能·算法·安全·重构·数字孪生
6Hzlia7 小时前
【Hot 100 刷题计划】 LeetCode 199. 二叉树的右视图 | C++ DFS 逆序遍历
c++·leetcode·深度优先
CappuccinoRose8 小时前
回溯法 - 软考备战(四十三)
算法·排列组合·路径·n皇后·子集·解数独·岛屿
AC赳赳老秦8 小时前
OpenClaw进阶技巧:批量修改文件内容、替换关键词,解放双手
java·linux·人工智能·python·算法·测试用例·openclaw