当前位置:   article > 正文

二叉树——链式存储结构_本关任务要求针对二叉树的链式存储方式完成相关基本操作,分别实现二叉树的清空、

本关任务要求针对二叉树的链式存储方式完成相关基本操作,分别实现二叉树的清空、

第一关 二叉树创建及遍历

任务描述

本关任务:实现二叉树的创建函数及二叉树的遍历函数。

相关知识

二叉树可用顺序方式存储,也可使用链式存储,本关使用二叉树的链式存储方式。结点数据结构定义为:

 
  1. struct node
  2. {
  3. DataType info ;
  4. struct node *lchild , *rchild ;
  5. };

二叉树的链式存储结构举例如下图所示:

创建二叉树时,可采用递归算法,其中一种方法是,将二叉树先扩充为扩二叉树,然后按先序遍历的结点顺序输入,如:

上图中,#结点为扩充的外部结点,输入该二叉树时输入结点顺序为:AB#DF###CE#G###

  1. #include <iostream>
  2. using namespace std;
  3. typedef char DataType;
  4. // 二叉树数据结构
  5. struct node
  6. {
  7. DataType info; // 存放结点数据
  8. struct node* lchild; // 指向左孩子的指针
  9. struct node* rchild; // 指向右孩子的指针
  10. };
  11. typedef struct node* BiTree; // 定义二叉树结构体指针类型
  12. /* 创建二叉树
  13. 函数名:createBiTree
  14. 参数:无
  15. 返回值:二叉树根结点指针
  16. */
  17. BiTree createBiTree(void)
  18. {
  19. // 请在此处填写代码,完成二叉树的创建,返回值是二叉树的根结点指针
  20. /********** Begin **********/
  21. DataType ch;
  22. struct node* tree;
  23. cin >> ch; // 读取输入的字符
  24. if (ch == '#') // 如果输入的字符是 '#',表示空结点
  25. return NULL;
  26. else
  27. {
  28. // 分配内存空间创建新结点
  29. tree = (struct node*)malloc(sizeof(struct node));
  30. tree->info = ch; // 设置结点数据
  31. tree->lchild = createBiTree(); // 递归创建左子树
  32. tree->rchild = createBiTree(); // 递归创建右子树
  33. return tree; // 返回根结点指针
  34. }
  35. /********** End *********/
  36. }
  37. void visit(BiTree T)
  38. {
  39. cout << T->info; // 输出结点T的数据
  40. }
  41. // 先根遍历二叉树
  42. void preOrder(BiTree root)
  43. {
  44. /********** Begin **********/
  45. if (root == NULL)
  46. return;
  47. visit(root); // 访问根结点
  48. preOrder(root->lchild); // 递归先根遍历左子树
  49. preOrder(root->rchild); // 递归先根遍历右子树
  50. /********** End *********/
  51. }
  52. // 中根遍历二叉树
  53. void inOrder(BiTree root)
  54. {
  55. if (root == NULL)
  56. return;
  57. inOrder(root->lchild); // 递归中根遍历左子树
  58. visit(root); // 访问根结点
  59. inOrder(root->rchild); // 递归中根遍历右子树
  60. }
  61. // 后根遍历二叉树
  62. void postOrder(BiTree root)
  63. {
  64. /********** Begin **********/
  65. if (root == NULL)
  66. return;
  67. postOrder(root->lchild); // 递归后根遍历左子树
  68. postOrder(root->rchild); // 递归后根遍历右子树
  69. visit(root); // 访问根结点
  70. /********** End *********/
  71. }
  72. int main(void)
  73. {
  74. BiTree root = createBiTree(); // 创建二叉树,获取根结点指针
  75. preOrder(root); // 先根遍历
  76. cout << '\n';
  77. inOrder(root); // 中根遍历
  78. cout << '\n';
  79. postOrder(root); // 后根遍历
  80. }

这段程序实现了二叉树的创建和三种遍历方式(先根遍历、中根遍历和后根遍历)的功能。

具体说明如下:

  1. 定义了二叉树的数据结构 node,包括 info(存放结点数据)、lchild(指向左孩子的指针)和 rchild(指向右孩子的指针)。
  2. 定义了二叉树结构体指针类型 BiTree
  3. createBiTree 函数用于创建二叉树,通过递归方式实现。用户从键盘输入二叉树的结点数据,以先序方式构建二叉树,并返回根结点指针。
  4. visit 函数用于输出结点的数据。
  5. preOrder 函数用于先根遍历二叉树,先访问根结点,然后递归遍历左子树和右子树。
  6. inOrder 函数用于中根遍历二叉树,先递归遍历左子树,然后访问根结点,最后递归遍历右子树。
  7. postOrder 函数用于后根遍历二叉树,先递归遍历左子树,然后递归遍历右子树,最后访问根结点。
  8. main 函数通过调用 createBiTree 创建二叉树,并依次调用先根遍历、中根遍历和后根遍历函数,输出遍历结果。

第二关 计算二叉树中叶子的个数

任务描述

本关任务:在完成第一关的基础上,编写一个函数,能计算一棵二叉树中树叶的个数并输出。

测试说明

平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:

测试输入:AB#DF###CE#G###

预期输出:2

  1. #include <iostream>
  2. using namespace std;
  3. typedef char DataType;
  4. // 二叉树数据结构
  5. struct node
  6. {
  7. DataType info; // 存放结点数据
  8. struct node* lchild; // 指向左孩子的指针
  9. struct node* rchild; // 指向右孩子的指针
  10. };
  11. typedef struct node* BiTree; // 定义二叉树结构体指针类型
  12. /* 创建二叉树
  13. 函数名:createBiTree
  14. 参数:无
  15. 返回值:二叉树根结点指针
  16. */
  17. BiTree createBiTree(void)
  18. {
  19. char ch;
  20. BiTree root;
  21. cin >> ch; // 读取输入的字符
  22. if (ch == '#') // 如果输入的字符是 '#',表示空结点
  23. root = NULL;
  24. else
  25. {
  26. // 分配内存空间创建新结点
  27. root = new struct node;
  28. root->info = ch; // 设置结点数据
  29. root->lchild = createBiTree(); // 递归创建左子树
  30. root->rchild = createBiTree(); // 递归创建右子树
  31. }
  32. return root;
  33. }
  34. void visit(BiTree T)
  35. {
  36. cout << T->info; // 输出结点T的数据
  37. }
  38. int countLeaf(BiTree root)
  39. {
  40. // 请在此处填写代码,计算二叉树中叶子结点的个数
  41. /********** Begin **********/
  42. int count = 0;
  43. if (root == NULL)
  44. return count;
  45. // 判断是否为叶子结点,若是则计数加一
  46. if (root->lchild == NULL && root->rchild == NULL)
  47. count++;
  48. // 递归统计左子树和右子树中叶子结点的个数
  49. count += countLeaf(root->lchild);
  50. count += countLeaf(root->rchild);
  51. return count;
  52. /********** End **********/
  53. }
  54. int main(void)
  55. {
  56. BiTree root = createBiTree(); // 创建二叉树,获取根结点指针
  57. cout << countLeaf(root); // 输出二叉树中叶子结点的个数
  58. }

这段程序的功能是创建一个二叉树,并计算该二叉树中叶子节点的个数。

具体功能说明如下:

  1. 定义了二叉树的数据结构 node,包括 info(存放结点数据)、lchild(指向左孩子的指针)和 rchild(指向右孩子的指针)。
  2. 定义了二叉树结构体指针类型 BiTree
  3. createBiTree 函数用于创建二叉树,通过递归方式实现。用户从键盘输入二叉树的结点数据,以先序方式构建二叉树,并返回根结点指针。
  4. visit 函数用于输出结点的数据。
  5. countLeaf 函数用于计算二叉树中叶子结点的个数。通过递归遍历二叉树,当遍历到叶子结点时,计数加一,然后递归统计左子树和右子树中的叶子结点个数,并将结果累加。
  6. main 函数通过调用 createBiTree 创建二叉树,并调用 countLeaf 计算叶子结点的个数,并将结果输出。

第三关 实现二叉树左右子树互换

任务描述

本关任务:编写一个把二叉树左右子树交换的函数。

以下图一所示的二叉树为例,左右子树交换后如图二所示。

测试输入:ABC####

预期输出(中序遍历):ABC

  1. #include <iostream>
  2. using namespace std;
  3. typedef char DataType;
  4. // 二叉树数据结构
  5. struct node
  6. {
  7. DataType info; // 存放结点数据
  8. struct node* lchild; // 指向左孩子的指针
  9. struct node* rchild; // 指向右孩子的指针
  10. };
  11. typedef struct node* BiTree; // 定义二叉树结构体指针类型
  12. /* 创建二叉树
  13. 函数名:createBiTree
  14. 参数:无
  15. 返回值:二叉树根结点指针
  16. */
  17. BiTree createBiTree(void)
  18. {
  19. char ch;
  20. BiTree root;
  21. cin >> ch; // 读取输入的字符
  22. if (ch == '#') // 如果输入的字符是 '#',表示空结点
  23. root = NULL;
  24. else
  25. {
  26. // 分配内存空间创建新结点
  27. root = new struct node;
  28. root->info = ch; // 设置结点数据
  29. root->lchild = createBiTree(); // 递归创建左子树
  30. root->rchild = createBiTree(); // 递归创建右子树
  31. }
  32. return root;
  33. }
  34. void changeLR(BiTree root)
  35. {
  36. // 请在此处填写代码,完成二叉树左右子树互换
  37. /********** Begin **********/
  38. if (root == NULL)
  39. return;
  40. else
  41. {
  42. BiTree tree = root->lchild;
  43. root->lchild = root->rchild;
  44. root->rchild = tree;
  45. changeLR(root->lchild);
  46. changeLR(root->rchild);
  47. }
  48. /********** End **********/
  49. }
  50. void visit(BiTree T) // 输出结点T的数据
  51. {
  52. cout << T->info;
  53. }
  54. void inOrder(BiTree root)
  55. {
  56. if (root == NULL)
  57. return;
  58. inOrder(root->lchild);
  59. visit(root);
  60. inOrder(root->rchild);
  61. }
  62. int main(void)
  63. {
  64. BiTree root = createBiTree(); // 创建二叉树,获取根结点指针
  65. changeLR(root); // 左右子树互换
  66. inOrder(root); // 中序遍历
  67. }

这段程序的功能如下:

  1. 定义了一个二叉树的数据结构,其中每个节点包含一个字符类型的数据和指向左右孩子的指针。
  2. 提供了函数createBiTree用于创建二叉树。它通过递归方式读取用户输入的字符,如果输入的字符是'#',表示空节点;否则,创建一个新节点并设置节点数据,然后递归创建左子树和右子树,并将它们链接到当前节点。
  3. 提供了函数changeLR用于实现二叉树的左右子树互换。它通过递归方式遍历二叉树的所有节点,对于每个节点,交换其左右子树的指针。
  4. 提供了函数visit用于输出节点的数据。
  5. 提供了函数inOrder用于中序遍历二叉树。它通过递归方式遍历二叉树的所有节点,先访问左子树,然后输出当前节点的数据,最后访问右子树。
  6. main函数中,首先调用createBiTree创建二叉树,并将根节点指针赋值给root变量。然后调用changeLR函数对二叉树进行左右子树互换。最后调用inOrder函数进行中序遍历,输出互换后的二叉树节点数据。

第四关 计算二叉树中有两个孩子的结点个数

任务描述

本关任务:编写一个能计算二叉树中有两个孩子的满结点个数。

测试输入:ABC####

预期输出:0

  1. #include <iostream>
  2. using namespace std;
  3. typedef char DataType;
  4. // 二叉树数据结构
  5. struct node
  6. {
  7. DataType info; // 存放结点数据
  8. struct node* lchild, * rchild; // 指向左右孩子的指针
  9. };
  10. typedef struct node* BiTree; // 定义二叉树结构体指针类型
  11. /* 创建二叉树
  12. 函数名:createBiTree
  13. 参数:无
  14. 返回值:二叉树根结点指针
  15. */
  16. BiTree createBiTree(void)
  17. {
  18. char ch;
  19. BiTree root;
  20. cin >> ch; // 读取输入的字符
  21. if (ch == '#') // 如果输入的字符是 '#',表示空结点
  22. root = NULL;
  23. else
  24. {
  25. // 分配内存空间创建新结点
  26. root = new struct node;
  27. root->info = ch; // 设置结点数据
  28. root->lchild = createBiTree(); // 递归创建左子树
  29. root->rchild = createBiTree(); // 递归创建右子树
  30. }
  31. return root;
  32. }
  33. void visit(BiTree T)
  34. {
  35. cout << T->info;
  36. }
  37. int countFullNode(BiTree root)
  38. {
  39. // 请在此处填写代码,计算二叉树中满结点的个数
  40. /********** Begin **********/
  41. if (root == NULL)
  42. return 0;
  43. int count = 0;
  44. if (root->lchild != NULL && root->rchild != NULL)
  45. count = 1;
  46. count += countFullNode(root->lchild);
  47. count += countFullNode(root->rchild);
  48. return count;
  49. /*********** End **********/
  50. }
  51. int main(void)
  52. {
  53. BiTree root = createBiTree(); // 创建二叉树,获取根结点指针
  54. cout << countFullNode(root); // 输出二叉树中满结点的个数
  55. }

这段程序的功能如下:

  1. 定义了一个二叉树的数据结构,其中每个节点包含一个字符类型的数据和指向左右孩子的指针。
  2. 提供了函数 createBiTree 用于创建二叉树。它通过递归方式读取用户输入的字符,如果输入的字符是 '#',表示空节点;否则,创建一个新节点并设置节点数据,然后递归创建左子树和右子树,并将它们链接到当前节点。
  3. 提供了函数 visit 用于输出节点的数据。
  4. 提供了函数 countFullNode 用于计算二叉树中满结点(即同时具有左子树和右子树的节点)的个数。它通过递归方式遍历二叉树的所有节点,对于每个节点,如果其左子树和右子树都不为空,则将计数加一,并递归计算左子树和右子树中的满结点个数。
  5. main 函数中,首先调用 createBiTree 创建二叉树,并将根节点指针赋给变量 root。然后,调用 countFullNode 函数计算二叉树中满结点的个数,并将结果输出到标准输出流(屏幕)上。

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

闽ICP备14008679号