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; }}
- 1402 堆初步
- 堆排序的初步学习
- 堆和栈的初步理解
- 初步
- 数组,指针经验交流(堆,栈讨论初步……)
- Sun Java虚拟机畸形Gif文件处理堆溢出漏洞初步分析
- hdu2176取(m堆)石子游戏 组合游戏初步——NIM
- Java学习----day4——(1)关于栈内存和堆内存的初步了解
- 堆
- 堆
- 堆
- 堆
- 堆
- 堆
- 堆
- 堆
- 堆
- 堆
- sgu 345-Revolution
- 13. Actions speak loader than words. 事实胜于雄辩
- Android开发之短信发送
- ASP.NET Ajax用户名注册验证
- 1400 遍历
- 1402 堆初步
- 1403 二叉排序树非升序排序数列
- datagrid Info
- 1404 二叉排序树中查找
- 1406 逆序对
- Ways to Make Your IT Staff Unpoachable
- 更改文件 权限与属性/chmod/chown/chgrp
- android Toast大全(五种情形)建立属于你自己的Toast
- 在wcf中,客户端在单独的类库中,如何引用