AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

LeetCode 654. Maximum Binary Tree    原题链接    中等

作者: 作者的头像   wzc1995 ,  2018-08-20 03:28:26 ,  所有人可见 ,  阅读 1648


7


题目描述

给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:

  1. 二叉树的根是数组中的最大元素。
  2. 左子树是通过数组中最大值左边部分构造出的最大二叉树。
  3. 右子树是通过数组中最大值右边部分构造出的最大二叉树。

通过给定的数组构建最大二叉树,并且输出这个树的根结点。

样例

输入: [3,2,1,6,0,5]
输入: 返回下面这棵树的根节点:

      6
    /   \
   3     5
    \    / 
     2  0   
       \
        1

注意

  • 给定的数组的大小在 [1, 1000] 之间。

算法

(递归) $O(n^2)$
  1. 采用递归算法,假设 build(l, r) 表示对数组中 [l, r] 闭区间的部分构造二叉树;
  2. 首先找出最大值及其所在位置 max_i,然后构造一个新的结点 rt,递归 build(l, max_i - 1) 和 build(max_i + 1, r) 分别作为 rt 的左右儿子,最后返回该结点 rt。

时间复杂度

  • 最坏情况下,每次寻找的最大值都在当前区间的最左边,即数组是有序数组,这样就会有 n 层递归,总共需要 n + (n - 1) + (n - 2) + … + 1 次计算,所以时间复杂度是 $O(n^2)$。

C++ 代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* build(const vector<int>& nums, int l, int r) {
        if (l > r)
            return NULL;
        int max_num = nums[l], max_i = l;
        for (int i = l + 1; i <= r; i++)
            if (max_num < nums[i]) {
                max_num = nums[i];
                max_i = i;
            }
        TreeNode *rt = new TreeNode(max_num);
        rt -> left = build(nums, l, max_i - 1);
        rt -> right = build(nums, max_i + 1, r);
        return rt;
    }

    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
        return build(nums, 0, nums.size() - 1);
    }
};

0 评论

App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息