NOIP 2011 提高组初赛试题分析--28题-笛卡尔树

该篇博客探讨了如何构建笛卡尔树,这是一种特殊类型的二叉树,满足最小堆属性且中序遍历还原原始序列。给定一个正整数序列,博客详细介绍了算法实现,用于计算笛卡尔树的深度以及具有该深度的叶子节点数量。具体解题过程中,通过递归地解决子问题来更新最大深度和叶子节点计数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(笛卡尔树)对于一个给定的两两不等的正整数序列,笛卡尔树是这样的一棵二叉树:首先,它是一个最小堆,即除了根结点,每个节点的权值都大于父节点的权值;其次,它的中序遍历恰好就是给定的序列。例如,对于序列7、2、12、1、10、5、15、3,下图就是一棵对应的笛卡尔树。现输入序列的规模n(1≤n<100)和序列的n个元素,试求其对应的笛卡尔树的深度d(根节点深度为1),以及有多少个叶子节点的深度为d。

#include<iostream>
using namespace std;
const int SIZE=100+5;
const int INFINITY=1000000;
int n,a[SIZE],maxDeep,num;
void solve(int left,int right,int deep)
{
    int i,j,min;
    if(deep>maxDeep){
        maxDeep=deep;
        num=1;
    }
    else if(deep==maxDeep)
    _________①_________;  
    min= INFINITY;
    for(i=left;i<=right;i++)
        if(min>a[i]){
            min=a[i];
            _________②_________;   
        }
    if(left<j)
        _________③_________; 
    if(j<right)
        _________④_________;     
}
int main()
{
    int i;
    cin>>n;
    for(i=1;i<=n;i++)
        cin>>a[i];
    maxDeep=0;
    solve(1,n,1);
    cout<<maxDeep<<' '<<num<<endl;
    return 0;
}

答案如下:

1.  num++ / num = num + 1
2.  j = i
3.  solve(left, j - 1, deep + 1)
4.  solve(j + 1, right, deep + 1)

解题思路稍等,等我上完课后补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值