1155 Heap Paths
作者:互联网
大致题意就是给出一个完全二叉树的层次序列,按根右左的顺序,输出所有从根结点到叶子结点的路径。最后判断这个完全二叉树是大顶堆,或小顶堆,或非堆。
思路:
1,可以先序遍历(根左右)的方式,用二维动态数组vector 存储所有从根结点到叶子结点的路径,然后倒着输出这些路径。
2,可以根据堆的性质,判断完全二叉树是大顶堆,或小顶堆,或非堆。
(1)假设是大顶堆,若存在孩子结点值大于双亲结点,则不是大顶堆。
(2)假设是小顶堆,若存在孩子结点值小于双亲结点,则不是小顶堆。
(3)若(1)(2)任意一个假设都不成立,那么这个完全二叉树 非堆。
感觉最近的题,用假设法做判断很常见啊。比如这个
1089 狼人杀-简单版
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 5 const int maxn = 1011; 6 int n,cbt[maxn]; 7 8 vector<vector<int> > paths; 9 vector<int> path; 10 void DFS(int root) { //先序遍历 11 if(root > n) { 12 paths.push_back(path); 13 return ; 14 } 15 path.push_back(cbt[root]); 16 DFS(root*2); 17 if(root*2+1 <= n) 18 DFS(root*2+1); 19 path.pop_back(); 20 } 21 int main() { 22 scanf("%d",&n); 23 for(int i = 1; i <= n; ++i) 24 scanf("%d",&cbt[i]); 25 DFS(1); 26 for(int i = paths.size()-1; i >= 0; --i) { 27 for(int j = 0; j < paths[i].size(); ++j) { 28 if(j > 0) printf(" "); 29 printf("%d",paths[i][j]); 30 } 31 printf("\n"); 32 } 33 int isMax = 1,isMin = 1;//假设是大顶堆,或者小顶堆 34 for(int i = 2; i<= n;++i) { 35 if(cbt[i] > cbt[i/2]) isMax = 0;//非大顶堆 36 if(cbt[i] < cbt[i/2]) isMin = 0;//非小顶堆 37 } 38 if(isMax == 1) printf("Max Heap\n"); 39 else if(isMin == 1) printf("Min Heap\n"); 40 else printf("Not Heap\n"); 41 return 0; 42 }
标签:Paths,结点,cbt,大顶,1155,int,Heap,printf,root 来源: https://www.cnblogs.com/keep23456/p/12484936.html