654. 最大二叉树

一、递归

TreeNode* recur(vector<int>& nums, int m, int n)
{
    int max = nums[m];
    int mid = m;
    for (int i = m; i <= n; ++i)
    {
        if (nums[i] > max)
        {
            max = nums[i];
            mid = i;
        }
    }
    TreeNode* root = new TreeNode(max);
    if(m<=mid-1)
        root->left = recur(nums, m, mid - 1);
    if(mid+1<=n)
        root->right = recur(nums, mid + 1, n);
    return root;
}
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
    int m = 0, n = nums.size() - 1;
    TreeNode* root = recur(nums, m, n);
    return root;
}

二、另一种递归思路,效率差

 1 TreeNode* recur(TreeNode* root, int val)
 2 {
 3     TreeNode* node = new TreeNode(val);
 4     if (!root)
 5         return node;
 6     else if (root->val < val)
 7     {
 8         node->left = root;
 9         return node;
10     }
11     else
12     {
13         root->right = recur(root->right, val);
14         return root;
15     }
16 }
17 TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
18     if (nums.size() == 0)
19         return nullptr;
20     TreeNode* root = nullptr;
21     for (int i = 0; i < nums.size(); ++i)
22     {
23         root = recur(root, nums[i]);
24     }
25     return root;
26 }

三、单调栈,还没看懂

 1 TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
 2     int size = nums.size();
 3     if (size == 0)
 4         return nullptr;
 5     stack<TreeNode*> use;
 6     TreeNode* root = new TreeNode(nums[0]);
 7     TreeNode* last = root;
 8     use.push(root);
 9     for (int i = 1; i < size; ++i)
10     {
11         TreeNode* t = new TreeNode(nums[i]);
12         if (t->val > root->val)
13             root = t;
14         last = use.top();
15         if (!use.empty()&&t->val > last->val)
16         {
17             use.pop();
18             while (!use.empty() && t->val > use.top()->val)
19             {
20                 last = use.top();
21                 use.pop();
22             }
23             if (use.empty())
24             {
25                 t->left = last;
26             }
27             else
28             {
29                 use.top()->right = t;
30                 t->left = last;
31             }
32         }
33         else
34         {
35             use.top()->right = t;
36         }
37         use.push(t);
38     }
39     return root;
40 }

 

转载于:https://www.cnblogs.com/zouma/p/11523485.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值