1402 堆初步

来源:互联网 发布:linux开启8080端口 编辑:程序博客网 时间:2024/06/06 10:44
 
描述

如果一棵完全二叉树,如果其中的任意一棵子树的父亲节点的值都不小于他的孩子节点的值,我们称之为大顶堆;相反,如果一棵完全二叉树,如果其中任意一棵子树的父亲节点的值都不大于他的孩子节点的值,我们称之为小顶堆。对于一个给定的二叉树,判断他是否是一个大顶堆,或者是一个小顶堆。(8)不考虑空树情况

注意:输入只保证是二叉树,但不保证一定是一棵完全二叉树。

输入

输入有n+1行。第一行为测试数据的组数n, 一下的n行为n棵二叉树的广义表表示法所表示的二叉树。树中的元素为int

输出

输入一共有n行,分别对应输入的n棵二叉树。如果是大顶堆,输出Max-heap., 如果是小顶堆,输出Min-heap., 如果既不是大顶堆也不是小顶堆,输出No.

样例输入
31(2,3)3(1,2)2(1,3)
样例输出
Min-heap.Max-heap.No.

 

 

经典题目,需要建堆,然后进行判断

#include <iostream>#include <stack>#include <vector>#include <cctype>#include <cmath>#include <string.h>#define MAX 10000using namespace std;struct node{    int data;    node *left, *right;};node *creat();void run();int num(node*,int,int*);int checkTree(node*);int checkmax(node*);int checkmin(node*);int main(){    int times;     cin >> times;      while ( times -- > 0)         run();    return 0;}node *creat() //读取广义表然后建立二叉树{    node *p,*t = NULL;    int i,flag;    char *a = new char [MAX];    cin >> a;    int len = strlen(a);    stack <node*> STACK;    for ( i = 0; i < len; i++)    {        switch(a[i])        {        case '(':            STACK.push(p);            flag = 1;            break;        case ')':            //p = STACK.top();            STACK.pop();            break;        case ',':            flag = 2;            break;        default:            vector <int> aa;            while(i<len&&int(a[i]-48)<=9&&int(a[i]-48)>=0)            {                aa.push_back(int(a[i]-48));                i++;            }            i--;            int lenlen = aa.size();            int temp = 0;            int ii;            for ( ii =0 ; ii<lenlen;ii++)                temp+=aa[ii]*int(pow(10.0,lenlen - ii - 1));            p = new node;            p->data=temp;            p->left = NULL;            p->right = NULL;            if ( t == NULL)                t = p;            else if ( flag == 1)                STACK.top()->left=p;            else if ( flag == 2)                STACK.top()->right=p;        }    }    return t;}int num(node * t,int i,int *m) {     if(t==NULL)         return(0);     if(*m<i)         *m=i;     return( 1 + num(t->left, 2*i, m) + num(t->right, 2*i+1, m)); } int checkTree(node *t) //判断是否完全二叉树{ int maxn0=0; int n=num(t,1,&maxn0); if(n==maxn0) return(1); else return(0); } int checkmin(node *t) //判断是否小顶堆{    node *p = t;    if ( p ->left ==NULL && p -> right == NULL)        return 1;    else    {        if (p->left!=NULL&&p->right!=NULL)        {            if( p ->left ->data >= p->data && p ->right->data >= p->data)                return checkmin(p->left)&&checkmin(p->right);            if( p ->left ->data < p->data || p ->right->data < p->data)                return 0;        }        else if (p->left!=NULL&&p->right==NULL)        {            if( p ->left ->data >= p->data)                return checkmin(p->left);            if( p ->left ->data < p->data)                return 0;        }        else if (p->left==NULL&&p->right!=NULL)        {            if(  p ->right->data >= p->data)                return checkmin(p->right);            if( p ->right->data < p->data)                return 0;        }        else return 0;    }}int checkmax(node *t) //判断是否大顶堆{    node *p = t;    if ( p ->left == NULL && p -> right == NULL)        return 1;    else    {        if ( p->left!=NULL&&p->right!=NULL)        {            if( p ->left ->data <= p->data && p ->right->data <= p->data)                return checkmax(p->left)&&checkmax(p->right);            if( p ->left ->data > p->data || p ->right->data > p->data)                return 0;        }        else if ( p->left!=NULL&&p->right==NULL)        {            if( p ->left ->data <= p->data)                return checkmax(p->left);            if( p ->left ->data > p->data)                return 0;        }        else if ( p->left==NULL&&p->right!=NULL)        {            if( p ->right->data <= p->data)                return checkmax(p->right);            if(  p ->right->data > p->data)                return 0;        }        else return 0;    }}void run(){    node *q = creat();        if (checkTree(q) == 0)        cout<< "No."<<endl;    else    {        int max,min;        max = checkmax(q);        min = checkmin(q);        if (max == 1 && min == 0)            cout << "Max-heap."<<endl;        else  if ( min == 1 && max == 0)            cout << "Min-heap."<<endl;        else if (max == 1 && min==1)        {            cout << "Max-heap."<<endl;            cout << "Min-heap."<<endl;        }        else            cout << "No."<<endl;    }}


 

原创粉丝点击