03-树2 List Leaves

矫情吗;* 2022-07-26 04:06 97阅读 0赞
  1. #include <stdio.h>
  2. #include <ctype.h>
  3. struct Node {
  4. int root; //记录节点是否是根节点
  5. int left;
  6. int right;
  7. };
  8. int main() {
  9. // freopen("test.txt", "r", stdin);
  10. int n;
  11. struct Node nodes[10];
  12. scanf("%d", &n);
  13. for (int i = 0; i < n; ++i) { //初始化树节点
  14. nodes[i].root = 1; //没连接的节点都是根节点
  15. nodes[i].left = -1; //没连接的节点左右儿子都为空
  16. nodes[i].right = -1;
  17. }
  18. for (int i = 0; i < n; ++i) { //构造树
  19. char ch1, ch2;
  20. scanf("\n%c %c", &ch1, &ch2);
  21. if (isdigit(ch1)) { //如果左儿子存在,将左儿子连接至该节点
  22. nodes[i].left = ch1 - '0'; //指针指向左儿子
  23. nodes[ch1 - '0'].root = 0; //左儿子取消根节点标记
  24. }
  25. if (isdigit(ch2)) {
  26. nodes[i].right = ch2 - '0';
  27. nodes[ch2 - '0'].root = 0;
  28. }
  29. }
  30. int root;
  31. for (int i = 0; i < n; ++i) //找到树根
  32. if (nodes[i].root == 1) {
  33. root = i;
  34. break;
  35. }
  36. //构造完树后,层序遍历树,依次输出叶节点;层序遍历过程:从根节点开始依次将左右儿子入队,直到队列为空
  37. int leaves = 0; //记录输出叶节点个数,方便输出时第一个节点输出前没有空格
  38. int queue[10]; //节点队列,只保存节点下标
  39. int head = 0, rear = 0;
  40. queue[rear++] = root; //根节点入队
  41. while (rear - head) {
  42. int node = queue[head++]; //队首节点出队
  43. if (nodes[node].left == -1 && nodes[node].right == -1) { //输出叶节点
  44. if (leaves)
  45. printf(" ");
  46. printf("%d", node);
  47. ++leaves;
  48. }
  49. if (nodes[node].left != -1) { //如果存在,左儿子入队
  50. queue[rear++] = nodes[node].left;
  51. }
  52. if (nodes[node].right != -1) { //如果存在,右儿子入队
  53. queue[rear++] = nodes[node].right;
  54. }
  55. }
  56. return 0;
  57. }

题目:输出树的所有的叶节点

  1. 主要是层序遍历,用一个队列来顺序装左儿子,右儿子,head指向当前的遍历到的节点下标,rear指向将要遍历的最后的那个最右边的节点下标,如果head没有指向rear最后一个下标的话,就一直循环下去

发表评论

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

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

相关阅读

    相关 List Leave

    本次作业是建立二叉树并输出叶结点 (1)首先是定义结点,包括左孩子,右孩子 typedef struct { int lch;//左孩子

    相关 Leaving Microsoft!!!

    在微软工作了近两年后,终于还是决定离开了。。。 回首这段微软的时光,让我对软件的开发有了一个全新的理解,真正意义上体会了eXtreme Programming的好处,