L2-012 关于堆的判断

将一系列给定数字顺序插入一个初始为空的小顶堆H[]。随后判断一系列相关命题是否为真。命题分下列几种:

  • x is the rootx是根结点;
  • x and y are siblingsxy是兄弟结点;
  • x is the parent of yxy的父结点;
  • x is a child of yxy的一个子结点。
    输入格式:
    每组测试第1行包含2个正整数N(≤ 1000)和M(≤ 20),分别是插入元素的个数、以及需要判断的命题数。下一行给出区间[−10000,10000]内的N个要被插入一个初始为空的小顶堆的整数。之后M行,每行给出一个命题。题目保证命题中的结点键值都是存在的。
    输出格式:
    对输入的每个命题,如果其为真,则在一行中输出T,否则输出F
    输入样例:
5 4
46 23 26 24 10
24 is the root
26 and 23 are siblings
46 is the parent of 23
23 is a child of 10
结尾无空行

输出样例:

F
T
F
T
结尾无空行

走的弯路: 没有看清题目,用了向下调整,最后结果错误。(所以,永远不要在读题上节省时间)

#include <bits/stdc++.h>

using namespace std;

int N;
int cnt;
vector<int> tree;

void rebuild(int lc)
{
    int temp;
    if(lc == 0)
    {
        return;
    }
    if(tree[lc] > tree[lc * 2])
    {
        temp = tree[lc];
        tree[lc] = tree[lc * 2];
        tree[lc * 2] = temp;
        if(lc * 2 * 2 <= N)
        {
            rebuild(lc * 2);
        }
    }
    if(lc * 2 + 1 <= N)
    {
        if(tree[lc] > tree[lc * 2 + 1])
        {
            temp = tree[lc];
            tree[lc] = tree[lc * 2 + 1];
            tree[lc * 2 + 1] = temp;
            if((lc * 2 + 1) * 2 <= N)
            {
              rebuild(lc * 2 + 1);
            }
        }
    }
    
    rebuild(lc - 1);
}

int main()
{
    int N;
    int x;
    int M;
    int num;
    int num2;
    int order;
    char s[10];
    cin >> N >> M;
    tree.resize(N + 1);
    for(int i = 1; i <= N; i++)
    {
        cin >> tree[i];
    }
    rebuild(N / 2);
    
//     for(int i = 1; i <= N; i++)
//     {
//         cout << tree[i] << endl;
//     }
    
    while(M--)
    {
        cin >> num >> s;
        if(s[0] == 'a')
        {
            cin >> num2;
            cin >> s;
            cin >> s;
            for(int i = 1; i <= N; i++)
            {
                if(tree[i] == num)
                {
                    order = i;
                    break;
                }
            }
            order /= 2;
            if((num2 == tree[order * 2]) || (num2 == tree[order * 2 + 1]))
            {
                cout << 'T';
            }
            else
            {
                cout << 'F';
            }
        }
        else
        {
            cin >> s;
            if(s[0] == 'a')
            {
                cin >> s;
                cin >> s >> num2;
                for(int i = 1; i <= N; i++)
                {
                    if(tree[i] == num)
                    {
                        order = i;
                        break;
                    }
                }
                if(num2 == tree[order / 2])
                {
                    cout << 'T';
                }
                else
                {
                    cout << 'F';
                }
            }
            else
            {
                cin >> s;
                if(s[0] == 'r')
                {
                    if(tree[1] == num)
                    {
                        cout << 'T';
                    }
                    else
                    {
                        cout << 'F';
                    }
                }
                else
                {
                    cin >> s >> num2;
                    for(int i = 1; i <= N; i++)
                    {
                        if(tree[i] == num)
                        {
                            order = i;
                            break;
                        }
                    }
                    if((num2 == tree[order * 2]) || (num2 == tree[order * 2 + 1]))
                    {
                        cout << 'T';
                    }
                    else
                    {
                        cout << 'F';
                    }
                }
            }
        }
        if(M != 0)
        {
            cout << endl;
        }
    }
    
    return 0;
}

AC代码: 采用向上调整,每次插入时都进行调整。

#include <bits/stdc++.h>

using namespace std;

int cnt;
vector<int> tree;

void create(int x)
{
    tree[++cnt] = x;
    int i = cnt;
    int j = i / 2;
    while(j >= 1)
    {
        if(tree[j] > tree[i])
        {
            swap(tree[j], tree[i]);
            i = j;
            j = i / 2;
        }
        else
        {
            break;
        }
    }
}

int main()
{
    int N;
    int x;
    int M;
    int num;
    int num2;
    int order;
    char s[10];
    
    cin >> N >> M;
    
    tree.resize(N + 1);
    
    for(int i = 1; i <= N; i++)
    {
        cin >> x;
        create(x);
    }
    while(M--)
    {
        cin >> num >> s;
        if(s[0] == 'a')
        {
            cin >> num2;
            cin >> s;
            cin >> s;
            for(int i = 1; i <= N; i++)
            {
                if(tree[i] == num)
                {
                    order = i;
                    break;
                }
            }
            order /= 2;
            if((num2 == tree[order * 2]) || (num2 == tree[order * 2 + 1]))
            {
                cout << 'T';
            }
            else
            {
                cout << 'F';
            }
        }
        else
        {
            cin >> s;
            if(s[0] == 'a')
            {
                cin >> s;
                cin >> s >> num2;
                for(int i = 1; i <= N; i++)
                {
                    if(tree[i] == num)
                    {
                        order = i;
                        break;
                    }
                }
                if(num2 == tree[order / 2])
                {
                    cout << 'T';
                }
                else
                {
                    cout << 'F';
                }
            }
            else
            {
                cin >> s;
                if(s[0] == 'r')
                {
                    if(tree[1] == num)
                    {
                        cout << 'T';
                    }
                    else
                    {
                        cout << 'F';
                    }
                }
                else
                {
                    cin >> s >> num2;
                    for(int i = 1; i <= N; i++)
                    {
                        if(tree[i] == num)
                        {
                            order = i;
                            break;
                        }
                    }
                    if((num2 == tree[order * 2]) || (num2 == tree[order * 2 + 1]))
                    {
                        cout << 'T';
                    }
                    else
                    {
                        cout << 'F';
                    }
                }
            }
        }
        if(M != 0)
        {
            cout << endl;
        }
    }
    
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值