DS第5章学习小结

拼搏现实的明天。 2021-11-22 08:14 462阅读 0赞

一、谈谈你对本章的学习心得,或者任选本章一道题目,谈谈你解决该题的心得体会

  谈谈我做  第5章作业7-1 List Leaves  的心得体会吧

1627872-20190504193003120-680323887.png

1627872-20190504193012705-175162099.png

  简单讲,就是  输入一棵树,然后从上到下、从左到右输出叶子结点。

  这题其实跟老师在实验课上带我们写的那个  第5章实践1第2题7-2 深入虎穴  很像,都需要用到层次遍历,然后再稍作修改就差不多了。

附上我的代码:

ContractedBlock.gif ExpandedBlockStart.gif

  1. 1 #include<iostream>
  2. 2 #include<queue>
  3. 3 using namespace std;
  4. 4
  5. 5
  6. 6 typedef struct
  7. 7 {
  8. 8 int data[2];
  9. 9 }node;
  10. 10
  11. 11
  12. 12 int input(node *&a);//按顺序依次输入每个结点的左右孩子,无孩子则用‘-’代替
  13. 13 void find(const node *a, const int root);//从上到下、从左到右输出叶子结点
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18 int main()//List Leaves
  19. 19 {
  20. 20 node *a;
  21. 21
  22. 22
  23. 23 int root=0;
  24. 24 root=input(a);
  25. 25
  26. 26
  27. 27 find(a,root);
  28. 28
  29. 29
  30. 30 return 0;
  31. 31 }
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36 int input(node *&a)//按顺序依次输入每个结点的左右孩子,无孩子则用‘-’代替
  37. 37 {
  38. 38 int n=0;
  39. 39 cin>>n;
  40. 40 a=new node[n];
  41. 41
  42. 42
  43. 43 bool *vi;
  44. 44 vi=new bool[n];
  45. 45 for(int i=0; i<n; i++)
  46. 46 {
  47. 47 vi[i]=false;
  48. 48 }
  49. 49
  50. 50
  51. 51 for(int i=0; i<n; i++)
  52. 52 {
  53. 53 char x;
  54. 54 for(int j=0; j<2; j++)
  55. 55 {
  56. 56 cin>>x;//输入,若为正常的0~9数字则录入
  57. 57 if('0'<=x && x<='9')
  58. 58 {
  59. 59 a[i].data[j]=x-'0';
  60. 60 vi[x-'0']=true;
  61. 61 }
  62. 62 else
  63. 63 {
  64. 64 a[i].data[j]=-1;
  65. 65 }
  66. 66 }
  67. 67 }
  68. 68
  69. 69
  70. 70 for(int i=0; i<n; i++)
  71. 71 {
  72. 72 if(!vi[i])
  73. 73 {
  74. 74 return i;//返回根的下标
  75. 75 }
  76. 76 }
  77. 77 }
  78. 78
  79. 79
  80. 80 void find(const node *a, const int root)//从上到下、从左到右输出叶子结点
  81. 81 {
  82. 82 queue<int> q;
  83. 83 q.push(root);
  84. 84 int x=0;//以下用于表示队头元素(当前结点)
  85. 85 bool flag=true;//以下用于判断是否为第一次输出
  86. 86 bool empty=true;// 以下用于判断当前结点是否为叶子节点
  87. 87
  88. 88
  89. 89 while(!q.empty())
  90. 90 {
  91. 91 x=q.front();
  92. 92 q.pop();
  93. 93
  94. 94
  95. 95 empty=true;
  96. 96 for(int i=0; i<2; i++)
  97. 97 {
  98. 98 if(a[x].data[i]!=-1)
  99. 99 {
  100. 100 empty=false;//若不是-1则该结点还有孩子结点,该结点为非叶子节点
  101. 101 break;
  102. 102 }
  103. 103 }
  104. 104
  105. 105
  106. 106 if(!flag && empty)
  107. 107 {
  108. 108 cout<<' '<<x;
  109. 109 }
  110. 110 else if(flag && empty)
  111. 111 {
  112. 112 cout<<x;
  113. 113 flag=0;
  114. 114 }
  115. 115
  116. 116
  117. 117 if(!empty)
  118. 118 {
  119. 119 for(int i=0; i<2; i++)
  120. 120 {
  121. 121 if(a[x].data[i]!=-1)
  122. 122 {
  123. 123 q.push(a[x].data[i]);//将刚刚出队的结点(若该结点不为叶子节点)的孩子依次从左到右入队
  124. 124 }
  125. 125 }
  126. 126 }
  127. 127 }
  128. 128 }

  可以看到,只要在进行层次遍历的时候,顺便加个判断条件,  判断该结点是否为叶子节点,若为叶子结点,则输出,若不是,则继续遍历  就可以了。

  这题之后,我对用队列实现层次遍历有了更深刻的印象。

二、同时谈谈你对上次制定目标的完成情况

  完成了一半……只看了30页,50多页之后就开始说类了,还是有点懵,我自己对之前知识掌握不够牢固的问题。

三、以及接下来的目标

  学好第6章的图,将书上有关第6章的图的应用都看看看好多好多好多遍,要做到深刻理解!

转载于:https://www.cnblogs.com/ymj19/p/10809462.html

发表评论

表情:
评论列表 (有 0 条评论,462人围观)

还没有评论,来说两句吧...

相关阅读

    相关 树 单元小结

    \---恢复内容开始--- 这一章有三道编程作业  1.深入虎穴:虽然老师在上机的时候带着我们一起做了但是我按照老师说的做了之后还是有很多错误 从一开始的编译错误到段错误,

    相关 学习小结

    本章学习了图,图这种数据结构相对树的数据结构,又是复杂了许多,这一章图的作业是分别用深度搜索DFS和BFS广度搜索来输出非连通分量。抛开具体的存储结构,整个程序主要由三部分组成

    相关 学习小结

    第四章学习了串和数组的相关内容,以及学习了BF算法和KMP算法。这周上机课老师带着我们打了AI核心代码。 看到题目就觉得要求好多代码肯定很难写,听到老师说这道题目会有很多的边

    相关 学习小结

    题目: 给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序

    相关 学习小结

    一、本章内容小结: 本章主要学习了查找的基本概念以及对于基于不同的数据结构的各种查找表适用的查找方法的定义、查找及算法,其中主要包括3种不同结构的查找表:线性表、树表和散列表