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 }

 

 

posted @ 2020-03-13 10:44  tangq123  阅读(111)  评论(0编辑  收藏  举报