关于堆的判断

2023-07-30 13:43:30 浏览数 (2)

题目描述

将一系列给定数字顺序插入一个初始为空的小顶堆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

输入样例1 

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

输出样例1

F T F T

思路分析

首先反复调整建立小顶堆。

然后拆分字符串判断分出语句。

AC代码

代码语言:javascript复制
#include<iostream>
using namespace std;
class MinHeap{
    int data[512],n,m;
public:
    MinHeap(){
        cin>>n>>m;
        for(int i=0;i<n;i  )
            cin>>data[i];
        for(int i=n/2;i>=0;i--)
            Adjust(i,n-1);
        while(m--){
            string instruction;
            int x,y;
            cin>>x>>instruction;
            x= Index(x);
            if(instruction=="and"){
                cin>>y>>instruction>>instruction;
                y= Index(y);
                if(x>0&&y>0&&x<n&&y<n&&(x-1)/2==(y-1)/2)
                    cout<<'T'<<endl;
                else cout<<'F'<<endl;
            }else{
                cin>>instruction;
                if(instruction=="a"){
                    cin>>instruction>>instruction>>y;
                    y= Index(y);
                    if(y>=0&&x<n&&(x-1)/2==y)
                        cout<<'T'<<endl;
                    else cout<<'F'<<endl;
                }else{
                    cin>>instruction;
                    if(instruction=="root"){
                        if(x==0)
                            cout<<'T'<<endl;
                        else cout<<'F'<<endl;
                    }else{
                        cin>>instruction>>y;
                        y= Index(y);
                        if(x>=0&&y<n&&(y-1)/2==x)
                            cout<<'T'<<endl;
                        else cout<<'F'<<endl;
                    }
                }
            }
        }
    }
    void Adjust(int i,int m){
        int temp=data[i];
        for(int j=2*i 1;j<=m;j=j*2 1){
            if(j<m&&data[j]>data[j 1])
                j  ;
            if(data[j]>=temp)
                break;
            data[i]=data[j];
            i=j;
        }
        data[i]=temp;
    }
    int Index(int&node){
        for(int i=0;i<n;i  )
            if(node==data[i])
                return i;
    }
};
int main() {
    MinHeap test;
}

0 人点赞