【1043】Is It a Binary Search Tree (25 分)

举报
野猪佩奇996 发表于 2022/01/23 01:08:34 2022/01/23
【摘要】 #include<iostream>#include<stdio.h>#include<stdlib.h>#include<math.h>#include<string.h>#include<algorithm> #include<map>#inclu...

  
  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<math.h>
  5. #include<string.h>
  6. #include<algorithm>
  7. #include<map>
  8. #include<vector>
  9. #include<queue>
  10. using namespace std;
  11. //镜像树的先序遍历只需在原树先序遍历时交换左右子树的访问顺序
  12. struct node{
  13. int data; //数据域
  14. node *left,*right; //指针域
  15. };
  16. void insert(node* &root,int data){//注意地址的地址
  17. if(root == NULL){//到达空结点时,即为需要插入的位置
  18. root = new node;
  19. root->data=data;
  20. root->left=root->right=NULL; //此句不能为空
  21. return;
  22. }
  23. if(data < root->data) insert(root->left,data);//插在左子树
  24. else insert(root->right,data);
  25. }
  26. void preOrder(node* root,vector<int>&vi){ //先序遍历,结果存在vi
  27. if(root == NULL) return;
  28. vi.push_back(root->data);
  29. preOrder(root->left,vi);
  30. preOrder(root->right,vi);
  31. }
  32. //镜像树先序遍历,结果存放于vi
  33. void preOrderMirror(node* root,vector<int>&vi){
  34. if(root == NULL) return;
  35. vi.push_back(root->data);
  36. preOrderMirror(root->right,vi);
  37. preOrderMirror(root->left,vi);
  38. }
  39. void postOrder(node* root,vector<int>&vi){ //后序遍历,结果存放于vi
  40. if(root == NULL) return;
  41. postOrder(root->left,vi);
  42. postOrder(root->right,vi);
  43. vi.push_back(root->data);
  44. }
  45. //镜像树后序遍历,结果存放于vi
  46. void postOrderMirror(node* root,vector<int>&vi){
  47. if(root == NULL) return;
  48. postOrderMirror(root->right,vi);
  49. postOrderMirror(root->left,vi);
  50. vi.push_back(root->data);
  51. }
  52. //origin存放初始序列
  53. //pre,post为先序,后序,preM,postM为镜像树先序,后序
  54. vector<int> origin,pre,preM,post,postM;
  55. int main(){
  56. int n,data;
  57. node* root=NULL; //定义头结点
  58. scanf("%d",&n); //输入结点个数
  59. for(int i=0;i<n;i++){
  60. scanf("%d",&data);
  61. origin.push_back(data); //将数据加入origin
  62. insert(root,data); //将data插入二叉树
  63. }
  64. preOrder(root,pre); //求先序
  65. preOrderMirror(root,preM);//求镜像树先序
  66. postOrder(root,post); //求后序
  67. postOrderMirror(root,postM); //求镜像树后序
  68. if(origin == pre){ //初始序列等于先序序列!!注意可以这样vector比较!
  69. printf("YES\n");
  70. for(int i=0;i<post.size();i++){
  71. printf("%d",post[i]);
  72. if(i< post.size()-1) printf(" ");
  73. }
  74. }else if(origin == preM){ //初始序列等于镜像树先序序列
  75. printf("YES\n");
  76. for(int i=0;i<postM.size();i++){
  77. printf("%d",postM[i]);
  78. if(i< postM.size()-1) printf(" ");
  79. }
  80. }else{
  81. printf("NO\n"); //否则输出NO
  82. }
  83. system("pause");
  84. return 0;
  85. }

 

文章来源: andyguo.blog.csdn.net,作者:山顶夕景,版权归原作者所有,如需转载,请联系作者。

原文链接:andyguo.blog.csdn.net/article/details/99670161

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。