标签:Paths 结点 cbt 大顶 1155 int Heap printf root
大致题意就是给出一个完全二叉树的层次序列,按根右左的顺序,输出所有从根结点到叶子结点的路径。最后判断这个完全二叉树是大顶堆,或小顶堆,或非堆。
思路:
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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。