当前位置:   article > 正文

【数据结构与算法】树和二叉树(头歌)_采用先序法建立一棵二叉树,设计输出二叉树后序遍历的逆序,二叉树的数据域类型为字

采用先序法建立一棵二叉树,设计输出二叉树后序遍历的逆序,二叉树的数据域类型为字

树和二叉树

第1关:二叉树的基本操作

任务描述

测试说明

代码

第2关:输出二叉树后序遍历的逆序

任务描述

测试说明 

代码 

 第3关:按中序输出二叉树中的分支结点

任务描述

测试说明

 代码

第4关:前序输出二叉树节点值与层次值

任务描述

测试说明

代码 

 第5关:求二叉树中结点个数

任务描述

测试说明

 代码

第6关:求二叉树叶子结点数

任务描述

测试说明

代码 

 第7关:求二叉树的深度

任务描述

测试说明

代码 

第8关:二叉树交换左右子树

任务描述

测试说明

代码 

第9关:按中序遍历次序输出二叉树中度为1的结点

任务描述

测试说明

 代码

第1关:二叉树的基本操作

任务描述

题目描述: 设计二叉树,能够对二叉树进行先序、中序、后序和层序遍历,遍历的操作为输出结点的值,设计主函数,输入一棵二叉树,按先序、中序、后序、层序的遍历顺序输出结点的值。二叉树的结点数不超过20。

测试说明

输入描述:输入数据只有一组, 二叉树的结点均为一个数字, 数据为 0 代表当前结点为空。输入结点的值按照二叉树的先序遍历顺序, 比如输入:1 2 4 0 0 5 0 0 3 0 6 0 0, 0 表示空,输入的数字之间由空格分隔。

  1. 1
  2. / \
  3. 2 3
  4. / \ \
  5. 4 5 6

输出描述:输出先序、中序、后序和层序遍历二叉树得到的序列,各占一行,同一行的数字之间由空格分隔。

输入样例:

1 2 4 0 0 5 0 0 3 0 6 0 0

输出样例:

1 2 4 5 3 6

4 2 5 1 3 6

4 5 2 6 3 1

1 2 3 4 5 6

代码

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. struct BiNode {
  4. int data;
  5. struct BiNode *lchild, *rchild;
  6. };
  7. struct BiTree {
  8. struct BiNode *root;
  9. };
  10. void PreOrder(struct BiNode *bt) {
  11. //TODO:前序遍历递归算法
  12. //=========begin========
  13. if (bt == NULL)
  14. {
  15. return;
  16. }
  17. else
  18. {
  19. printf("%d ", bt->data);
  20. PreOrder(bt->lchild);
  21. PreOrder(bt->rchild);
  22. }
  23. //==========end==========
  24. }
  25. void InOrder(struct BiNode *bt) {
  26. //TODO:中序遍历递归算法
  27. //=========begin========
  28. if (bt == NULL)
  29. {
  30. return;
  31. }
  32. else
  33. {
  34. InOrder(bt->lchild);
  35. printf("%d ", bt->data);
  36. InOrder(bt->rchild);
  37. }
  38. //==========end==========
  39. }
  40. void PostOrder(struct BiNode *bt) {
  41. //TODO:后序遍历递归算法
  42. //=========begin========
  43. if (bt == NULL)
  44. {
  45. return;
  46. }
  47. else
  48. {
  49. PostOrder(bt->lchild);
  50. PostOrder(bt->rchild);
  51. printf("%d ", bt->data);
  52. }
  53. //==========end==========
  54. }
  55. void LevelOrder(struct BiNode *root) {
  56. //TODO:层次序遍历
  57. //=========begin========
  58. int front = -1, rear = -1;
  59. struct BiNode *q;
  60. struct BiNode *Q[30];
  61. if (root == NULL)
  62. {
  63. return;
  64. }
  65. Q[++rear] = root;
  66. while (front != rear)
  67. {
  68. q = Q[++front];
  69. printf("%d ", q->data);
  70. if (q->lchild != NULL)
  71. {
  72. Q[++rear] = q->lchild;
  73. }
  74. if (q->rchild != NULL)
  75. {
  76. Q[++rear] = q->rchild;
  77. }
  78. }
  79. //==========end==========
  80. }
  81. struct BiNode *Create(struct BiNode *bt) {
  82. //TODO:前序建立二叉树
  83. //=========begin========
  84. int num;
  85. scanf(" %d", &num);
  86. if (num == 0)
  87. {
  88. bt = NULL;
  89. }
  90. else
  91. {
  92. bt = (struct BiNode*)malloc(sizeof(struct BiNode));
  93. bt->data = num;
  94. bt->lchild = Create(bt->lchild);
  95. bt->rchild = Create(bt->rchild);
  96. }
  97. return bt;
  98. //==========end==========
  99. }
  100. void Release(struct BiNode *bt) {
  101. //TODO:销毁二叉树
  102. //=========begin========
  103. if (bt != NULL)
  104. {
  105. Release(bt->lchild);
  106. Release(bt->rchild);
  107. free(bt);
  108. }
  109. //==========end==========
  110. }
  111. int main() {
  112. struct BiTree b;
  113. b.root = Create(b.root);
  114. PreOrder(b.root);
  115. printf("\n");
  116. InOrder(b.root);
  117. printf("\n");
  118. PostOrder(b.root);
  119. printf("\n");
  120. LevelOrder(b.root);
  121. Release(b.root);
  122. return 0;
  123. }

第2关:输出二叉树后序遍历的逆序

任务描述

题目描述: 采用先序法建立一棵二叉树,设计输出二叉树后序遍历的逆序,二叉树的数据域类型为字符型,扩展二叉树的叶子结点用‘#’表示,要求可以输出多棵二叉树的后序遍历逆序,当二叉树为空时程序结束。

测试说明 

输入描述:循环输入多棵扩展二叉树的先序遍历序列,每棵树占一行,以回车结束,每棵二叉树中结点之间以空格隔开

输出描述:输出各二叉树后序遍历逆序,每次输出后面都换行,当二叉树为空时,输出“NULL”,程序结束。

输入样例:

A B # # C D # E # F # # G H # I K # # # #

A B D H # # I # # E J # # K # # C F L # # M # # G N # # O # #

#

输出样例:

A C G H I K D E F B

A C G O N F M L B E K J D I H

NULL

代码 

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. struct BiNode {
  4. char data;
  5. struct BiNode *lchild, *rchild;
  6. };
  7. struct BiTree {
  8. struct BiNode *root;
  9. };
  10. struct Stack{
  11. char data[100];
  12. int top;
  13. };
  14. void Init(struct Stack *s)
  15. {
  16. s->top = -1;
  17. }
  18. void Push(struct Stack *s, char x)
  19. {
  20. s->data[++s->top] = x;
  21. }
  22. char Pop(struct Stack *s)
  23. {
  24. return s->data[s->top--];
  25. }
  26. void Print(struct Stack *s)
  27. {
  28. while (s->top != -1)
  29. {
  30. printf("%c ", Pop(s));
  31. }
  32. }
  33. struct BiNode *Create(struct BiNode *bt) {
  34. char ch;
  35. scanf("%c ", &ch);
  36. if (ch == '#')
  37. bt = NULL;
  38. else {
  39. bt = (struct BiNode *)malloc(sizeof(struct BiNode));
  40. bt->data = ch;
  41. bt->lchild = Create(bt->lchild);
  42. bt->rchild = Create(bt->rchild);
  43. }
  44. return bt;
  45. }
  46. void RePreOrder(struct BiNode *bt, struct Stack *s) {
  47. //ToDo 递归输出二叉树后序遍历的逆序
  48. //========begin======
  49. if (bt == NULL)
  50. {
  51. return;
  52. }
  53. else
  54. {
  55. RePreOrder(bt->lchild, s);
  56. RePreOrder(bt->rchild, s);
  57. Push(s, bt->data);
  58. }
  59. //=========end=======
  60. }
  61. int Empty(struct BiTree *tree) {
  62. //ToDo 判断是否为空
  63. //========begin======
  64. if (tree->root == NULL)
  65. {
  66. return 1;
  67. }
  68. else
  69. {
  70. return 0;
  71. }
  72. //=========end=======
  73. }
  74. int main() {
  75. while (1) {
  76. struct BiTree A;
  77. //ToDo 设计主函数 以满足题意
  78. //========begin======
  79. struct Stack s;
  80. A.root = Create(A.root);
  81. Init(&s);
  82. if (Empty(&A))
  83. {
  84. printf("NULL");
  85. break;
  86. }
  87. RePreOrder(A.root, &s);
  88. Print(&s);
  89. printf("\n");
  90. //=========end=======
  91. }
  92. return 0;
  93. }

 第3关:按中序输出二叉树中的分支结点

任务描述

题目描述: 二叉树的结点数据域是字符型,空结点用‘#’表示,按前序遍历建立二叉树,按中序输出二叉树中所有的分支结点,以空格隔开。

测试说明

输入描述: 输入二叉树的扩展二叉树的前序遍历序列。

输出描述: 按中序输出二叉树中所有的分支结点,以空格隔开,最后一个结点后面有空格,占一行。

输入样例:

AB#C##D##

输出样例:

B A

 代码

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. struct BiNode {
  4. char data;
  5. struct BiNode *lchild, *rchild;
  6. };
  7. struct BiTree {
  8. struct BiNode *root;
  9. };
  10. struct BiNode *Create(struct BiNode *bt) {
  11. char ch;
  12. scanf(" %c", &ch);
  13. if (ch == '#')
  14. return NULL;
  15. else {
  16. bt = (struct BiNode *)malloc(sizeof(struct BiNode));
  17. bt->data = ch;
  18. bt->lchild = Create(bt->lchild);
  19. bt->rchild = Create(bt->rchild);
  20. }
  21. return bt;
  22. }
  23. void InOrder(struct BiNode *bt) {
  24. //ToDo 中序输出分支节点
  25. //========begin=======
  26. if (bt == NULL)
  27. {
  28. return;
  29. }
  30. else
  31. {
  32. InOrder(bt->lchild);
  33. if (bt->lchild != NULL || bt->rchild != NULL)
  34. {
  35. printf("%c ", bt->data);
  36. }
  37. InOrder(bt->rchild);
  38. }
  39. //=========end========
  40. }
  41. int Empty(struct BiTree *tree) {
  42. if (tree->root == NULL)
  43. return 1;
  44. else
  45. return 0;
  46. }
  47. int main() {
  48. struct BiTree btree;
  49. //ToDo 设计主函数 以满足题目需求
  50. //========begin=======
  51. btree.root = Create(btree.root);
  52. InOrder(btree.root);
  53. //=========end========
  54. return 0;
  55. }

第4关:前序输出二叉树节点值与层次值

任务描述

本关任务:设二叉树采用二叉链表存放,该结点结构为[lchild,data,level,rchild], 将二叉树中每个结点所在的层次值置入相应的 level 域,并按前序序列顺序输出每个结点的值和 level 值。

测试说明

输入样例1: A B H # # # D # I E # # #

输出样例1: A 1 B 2 H 3 D 2 I 3 E 4

输入样例2: A B # # C # #

输出样例2: A 1 B 2 C 2

输入样例3: A B D # # E # # C # #

输出样例3: A 1 B 2 D 3 E 3 C 2

代码 

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. struct BiNode {
  4. char data;
  5. int level;
  6. struct BiNode *lchild, *rchild;
  7. };
  8. struct BiTree {
  9. struct BiNode *root;
  10. };
  11. struct BiNode* Creat(struct BiNode* bt) {
  12. char ch;
  13. scanf(" %c", &ch);
  14. if (ch == '#')
  15. return NULL;
  16. else {
  17. bt = (struct BiNode*)malloc(sizeof(struct BiNode));
  18. bt->data = ch;
  19. bt->lchild = Creat(bt->lchild);
  20. bt->rchild = Creat(bt->rchild);
  21. }
  22. return bt;
  23. }
  24. void level(struct BiNode* bt, int l) {
  25. //TODO 将bt中level设置成当前层次值并打印、继续递归左右节点
  26. //=======begin======
  27. if (bt == NULL)
  28. {
  29. return;
  30. }
  31. else
  32. {
  33. printf("%c %d ", bt->data, l);
  34. level(bt->lchild, ++l);
  35. level(bt->rchild, l);
  36. }
  37. //========end=======
  38. }
  39. void preOrder(struct BiNode* bt) {
  40. if (bt != NULL) {
  41. preOrder(bt->lchild);
  42. if ((bt->lchild == NULL && bt->rchild != NULL) || (bt->lchild != NULL && bt->rchild == NULL)) {
  43. printf("%c ", bt->data);
  44. }
  45. preOrder(bt->rchild);
  46. }
  47. }
  48. int Empty(struct BiTree* tree) {
  49. if (tree->root == NULL)
  50. return 1;
  51. else
  52. return 0;
  53. }
  54. int main() {
  55. struct BiTree btree;
  56. btree.root = Creat(btree.root);
  57. level(btree.root, 1);
  58. printf("\n");
  59. return 0;
  60. }

 第5关:求二叉树中结点个数

任务描述

题目描述: 建立一棵二叉树,用二叉链表存储二叉树,计算二叉树中包含的结点个数。

测试说明

输入描述: 输入的数据只有一组,是一棵二叉树的先序遍历序列,结点的值为一个小写字母,号表示空结点,如输入:a b d e # # f # # # c # #,数据之间空一个格,得到的二叉树如下。

输出描述: 输出二叉树的结点个数,空树输出NULL

输入样例1: a b c # # # d e # # f # # 输出样例16

输入样例2: #                输出样例20

 代码

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. struct Binode {
  4. char data;
  5. struct Binode* lchild;
  6. struct Binode* rchild;
  7. };
  8. struct Bitree {
  9. struct Binode* root;
  10. };
  11. struct Binode* Creat(struct Binode* bt) {
  12. char d;
  13. scanf(" %c", &d);
  14. if (d == '#')
  15. bt = NULL;
  16. else {
  17. bt = (struct Binode*)malloc(sizeof(struct Binode));
  18. bt->data = d;
  19. bt->lchild = Creat(bt->lchild);
  20. bt->rchild = Creat(bt->rchild);
  21. }
  22. return bt;
  23. }
  24. void Release(struct Binode* bt) {
  25. if (bt != NULL) {
  26. Release(bt->lchild);
  27. Release(bt->rchild);
  28. free(bt);
  29. }
  30. }
  31. int Count(struct Binode* bt) {
  32. //ToDo 计算节点个数
  33. //=======begin======
  34. if (bt == NULL)
  35. {
  36. return 0;
  37. }
  38. return Count(bt->lchild) + Count(bt->rchild) + 1;
  39. //=======begin======
  40. }
  41. int main() {
  42. //ToDo 设计主函数 以满足题意需求
  43. //=======begin======
  44. struct Bitree btree;
  45. btree.root = Creat(btree.root);
  46. printf("%d", Count(btree.root));
  47. Release(btree.root);
  48. //=======begin======
  49. }

第6关:求二叉树叶子结点数

任务描述

题目描述: 二叉树结点的数据类型是字符型,按先序遍历建立二叉树,求叶子结点的个数。

测试说明

输入描述: 输入扩展二叉树的先序遍历序列,其中空字符为“#”,以空格隔开.

输出描述: 输出叶子结点的个数.

输入样例:

A B D H # # # E # I # # C F J # # # G # #

输出样例:

4

代码 

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. struct BiNode {
  4. char data;
  5. struct BiNode* lchild;
  6. struct BiNode* rchild;
  7. };
  8. int j = 0;
  9. struct BiNode* Creat(struct BiNode* bt) {
  10. //TODO:前序建立二叉树
  11. //========begin=======
  12. char ch;
  13. scanf(" %c", &ch);
  14. if (ch == '#')
  15. {
  16. bt = NULL;
  17. }
  18. else
  19. {
  20. bt = (struct BiNode*)malloc(sizeof(struct BiNode));
  21. bt->data = ch;
  22. bt->lchild = Creat(bt->lchild);
  23. bt->rchild = Creat(bt->rchild);
  24. }
  25. return bt;
  26. //=========end========
  27. }
  28. void Release(struct BiNode* bt) {
  29. //TODO:后续销毁二叉树
  30. //========begin=======
  31. if (bt != NULL)
  32. {
  33. Release(bt->lchild);
  34. Release(bt->rchild);
  35. free(bt);
  36. }
  37. //=========end========
  38. }
  39. void Preorder(struct BiNode* bt) {
  40. //TODO:前序遍历求叶子结点数
  41. //========begin=======
  42. if (bt == NULL)
  43. {
  44. return;
  45. }
  46. else
  47. {
  48. if (bt->lchild == NULL && bt->rchild == NULL)
  49. {
  50. j++;
  51. }
  52. Preorder(bt->lchild);
  53. Preorder(bt->rchild);
  54. }
  55. //=========end========
  56. }
  57. int main() {
  58. struct BiNode* root = NULL;
  59. root = Creat(root);
  60. Preorder(root);
  61. printf("%d\n", j);
  62. Release(root);
  63. return 0;
  64. }

 第7关:求二叉树的深度

任务描述

题目描述 采用先序法建立一棵二叉树,设计求该二叉树的深度,二叉树的数据域类型为字符型,扩展二叉树的叶子结点用‘#’表示,要求可以求多棵二叉树的深度,当二叉树的深度为 0 时程序结束。

测试说明

输入描述: 循环输入多棵扩展二叉树的先序遍历序列,每棵树占一行,以回车结束,每棵二叉树中结点之间以空格隔开.

输出描述: 输出各二叉树的深度,每次输出后面都换行.

输入样例:

A B # # C D # E # F # # G H # I K # # # #

A B D H # # I # # E J # # K # # C F L # # M # # G N # # O # #

#

输出样例:

6

4

0

代码 

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. struct BiNode {
  4. char data;
  5. struct BiNode* lchild;
  6. struct BiNode* rchild;
  7. };
  8. struct BiTree {
  9. struct BiNode* root;
  10. };
  11. struct BiNode* Creat(struct BiNode* bt) {
  12. char ch;
  13. scanf(" %c", &ch);
  14. if (ch == '#')
  15. bt = NULL;
  16. else {
  17. bt = (struct BiNode*)malloc(sizeof(struct BiNode));
  18. bt->data = ch;
  19. bt->lchild = Creat(bt->lchild);
  20. bt->rchild = Creat(bt->rchild);
  21. }
  22. return bt;
  23. }
  24. int Depth(struct BiNode* bt) {
  25. //ToDo 递归求最大深度
  26. //========BEGIN=======
  27. if (bt == NULL)
  28. {
  29. return 0;
  30. }
  31. int left = Depth(bt->lchild);
  32. int right = Depth(bt->rchild);
  33. return left > right ? (left+1) : (right+1);
  34. //=========END========
  35. }
  36. int main() {
  37. while (1) {
  38. struct BiTree A;
  39. //ToDo 设计主函数 以满足题意
  40. //========BEGIN=======
  41. A.root = Creat(A.root);
  42. printf("%d\n", Depth(A.root));
  43. if (Depth(A.root) == 0)
  44. {
  45. break;
  46. }
  47. //=========END========
  48. }
  49. return 0;
  50. }

第8关:二叉树交换左右子树

任务描述

本关任务:二叉树的结点数据域是字符型,空用‘#’表示,按前序遍历建立二叉树,交换二叉树中所有结点的左右子树,再前序遍历输出。

测试说明

输入样例1: A B # # C # #                                 输出样例1: A C B

输入样例2: A B H # # # D C # # I E # # #    输出样例2: A D I E C B H

输入样例3: A B D # # E # # C # #                   输出样例3: A C B E D

代码 

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. struct BiNode {
  4. char data;
  5. struct BiNode* lchild;
  6. struct BiNode* rchild;
  7. };
  8. struct BiNode* Creat(struct BiNode* bt) {
  9. char ch;
  10. scanf(" %c", &ch);
  11. if (ch == '#')
  12. return NULL;
  13. else {
  14. bt = (struct BiNode*)malloc(sizeof(struct BiNode));
  15. bt->data = ch;
  16. bt->lchild = Creat(bt->lchild);
  17. bt->rchild = Creat(bt->rchild);
  18. }
  19. return bt;
  20. }
  21. void Change(struct BiNode* bt) {
  22. //TODO 交换左右子树 并将子树继续交换
  23. //==========begin=========
  24. if (bt == NULL)
  25. {
  26. return;
  27. }
  28. else
  29. {
  30. struct BiNode* temp = bt->lchild;
  31. bt->lchild = bt->rchild;
  32. bt->rchild = temp;
  33. Change(bt->lchild);
  34. Change(bt->rchild);
  35. }
  36. //===========end==========
  37. }
  38. void Print(struct BiNode* bt) {
  39. printf("%c ", bt->data);
  40. if (bt->lchild != NULL)
  41. Print(bt->lchild);
  42. if (bt->rchild != NULL)
  43. Print(bt->rchild);
  44. }
  45. int Empty(struct BiNode* root) {
  46. if (root == NULL)
  47. return 1;
  48. else
  49. return 0;
  50. }
  51. int main() {
  52. struct BiNode* root = NULL;
  53. root = Creat(root);
  54. if (Empty(root))
  55. return 0;
  56. Change(root);
  57. Print(root);
  58. return 0;
  59. }

第9关:按中序遍历次序输出二叉树中度为1的结点

任务描述

本关任务:二叉树的结点数据域是字符型,空结点用‘#’表示,按前序遍历建立二叉树,按中序输出二叉树中度为 1 的结点。

测试说明

输入样例1: A B H # # # D # I E # # # 输出样例1: B D I 

输入样例2: A # B # #            输出样例2: A

输入样例3: A B C D # # # # #       输出样例3: C B A

 代码

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. struct BiNode {
  4. char data;
  5. struct BiNode *lchild;
  6. struct BiNode *rchild;
  7. };
  8. typedef struct BiNode BiNode;
  9. /*前序建立二叉树*/
  10. BiNode *createBiTree() {
  11. char ch;
  12. scanf("%c ", &ch);
  13. if (ch == '#') {
  14. return NULL;
  15. } else {
  16. BiNode *node = (BiNode *) malloc(sizeof(BiNode));
  17. node->data = ch;
  18. node->lchild = createBiTree();
  19. node->rchild = createBiTree();
  20. return node;
  21. }
  22. }
  23. void inOrderTraversal(BiNode *root) {
  24. /*按中序输出二叉树中度为1的结点*/
  25. /*=========begin========*/
  26. if (root == NULL)
  27. {
  28. return;
  29. }
  30. else
  31. {
  32. inOrderTraversal(root->lchild);
  33. if ((root->lchild == NULL && root->rchild != NULL) || (root->lchild != NULL && root->rchild == NULL))
  34. {
  35. printf("%c ", root->data);
  36. }
  37. inOrderTraversal(root->rchild);
  38. }
  39. /*==========end========*/
  40. }
  41. int main() {
  42. BiNode *root = createBiTree(); /*前序建立二叉树*/
  43. inOrderTraversal(root); /*中序输出度为1的结点*/
  44. printf("\n");
  45. return 0;
  46. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/569917
推荐阅读
相关标签
  

闽ICP备14008679号