当前位置:   article > 正文

假设二叉树采用二叉链表存储结构,设计一个算法,求非空二叉树b的宽度(即具有结点数最多的那一层的结点个数)。_假设二叉树采用二叉链表存储结构,设计一个算法

假设二叉树采用二叉链表存储结构,设计一个算法

结合图例,一目了然! 

二叉树

(一)熟悉掌握层序遍历的算法编程:

C语言实现层序遍历:

  1. typedef struct{
  2. BiTree data[MaxSize];//保存队列中的结点指针
  3. int level[MaxSize];//保存data中相同下标结点的层次
  4. int front, rear;
  5. }BQ;
  6. void leverOrder(BiTree b) {
  7. BiTree p;
  8. BQ Q;
  9. Q.front = Q.rear = -1;//队列为空
  10. Q.rear++;
  11. Q.data[Q.rear] = b;//根结点指针入队
  12. while (Q.front < Q.rear) {
  13. Q.front++;//出队
  14. p = Q.data[Q.front];//出队结点
  15. printf("%c ", p->data);
  16. if (p->lchild != NULL) {//左孩子进队列
  17. Q.rear++;
  18. Q.data[Q.rear] = p->lchild;
  19. }
  20. if (p->rchild != NULL) {//右孩子进队列
  21. Q.rear++;
  22. Q.data[Q.rear] = p->rchild;
  23. }
  24. }
  25. }

 (二)利用层序遍历和相关算法设计出算法方案

代码如下:

  1. typedef struct{
  2. BiTree data[MaxSize];//保存队列中的结点指针
  3. int level[MaxSize];//保存data中相同下标结点的层次
  4. int front, rear;
  5. }BQ;
  6. int BTWidth(BiTree b) {
  7. BiTree p;
  8. int k, max, i, n;
  9. BQ Q;
  10. Q.front = Q.rear = -1;//队列为空
  11. Q.rear++;
  12. Q.data[Q.rear] = b;//根结点指针入队
  13. Q.level[Q.rear] = 1;//根结点的层次为1
  14. while (Q.front<Q.rear) {
  15. Q.front++;//出队
  16. p = Q.data[Q.front];//出队结点
  17. k = Q.level[Q.front];//出队结点的层次
  18. if (p->lchild != NULL) {//左孩子进队列
  19. Q.rear++;
  20. Q.data[Q.rear] = p->lchild;
  21. Q.level[Q.rear] = k + 1;
  22. }
  23. if (p->rchild != NULL) {//右孩子进队列
  24. Q.rear++;
  25. Q.data[Q.rear] = p->rchild;
  26. Q.level[Q.rear] = k + 1;
  27. }
  28. }
  29. max = 0, i = 0;//max保存同一层最多的结点个数
  30. k = 1;//k表示从第一层开始查找
  31. while (i<=Q.rear) {//i扫描队中所有元素
  32. n = 0;//n统计第k层的结点个数
  33. while (i <= Q.rear && Q.level[i] == k) {
  34. n++;
  35. i++;
  36. }
  37. k = Q.level[i];
  38. if (n > max)
  39. max = n;//保存最大的n
  40. }
  41. return max;
  42. }

(1)其中,这部分代码的逻辑是为了获取level数组

(2)这部分代码是为了统计出level数组中的具有结点数最多的那一层的结点个数。

(3)完整的推导过程如下图所示: 

(4)实验结果:

(5)C语言完整代码:

  1. //假设二叉树采用二叉链表存储结构,设计一个算法,求非空二叉树b的宽度(即具有结点数最多
  2. //的那一层的结点个数)
  3. //在考层次遍历
  4. //在层次遍历的过程中,标记出每一个结点的层数(或者说是将每一层的结点做出来分类)
  5. //所以其实这道题的重点就是‘按层划分’
  6. //三种解决方案
  7. //①记录的同时,为每个结点绑定一个对应的高度值
  8. //②做两个队列,轮换使用
  9. //③一个队列,中间加上‘分界线结点’
  10. #include<stdio.h>
  11. #include<stdlib.h>
  12. #include<iostream>
  13. using namespace std;
  14. #define MaxSize 100
  15. typedef char ElemType;
  16. typedef struct BiNode {
  17. ElemType data;
  18. BiNode* lchild;
  19. BiNode* rchild;
  20. }BiNode, * BiTree;
  21. //构建二叉树
  22. BiNode* Create(BiNode* bt) {
  23. static int i = 0;
  24. char ch;
  25. //string str = "AB#D##C##";
  26. //string str = "124##56##7##3##";
  27. //string str = "ABD#G##E##CF###";
  28. //string str = "ABD#GH##I##E##CF###";
  29. //string str = "ABD#GH##I##E##CFJ##K###";
  30. string str = "ABDH##I##E#J##CFK###GL###";
  31. ch = str[i++];
  32. if (ch == '#')bt = NULL;//建立一棵空树
  33. else {
  34. bt = (BiTree)malloc(sizeof(BiNode)); bt->data = ch;//生成一个结点,数据域为ch
  35. bt->lchild = Create(bt->lchild);//递归建立左子树
  36. bt->rchild = Create(bt->rchild);//递归建立右子树
  37. }
  38. return bt;
  39. }
  40. typedef struct{
  41. BiTree data[MaxSize];//保存队列中的结点指针
  42. int level[MaxSize];//保存data中相同下标结点的层次
  43. int front, rear;
  44. }BQ;
  45. int BTWidth(BiTree b) {
  46. BiTree p;
  47. int k, max, i, n;
  48. BQ Q;
  49. Q.front = Q.rear = -1;//队列为空
  50. Q.rear++;
  51. Q.data[Q.rear] = b;//根结点指针入队
  52. Q.level[Q.rear] = 1;//根结点的层次为1
  53. while (Q.front<Q.rear) {
  54. Q.front++;//出队
  55. p = Q.data[Q.front];//出队结点
  56. k = Q.level[Q.front];//出队结点的层次
  57. if (p->lchild != NULL) {//左孩子进队列
  58. Q.rear++;
  59. Q.data[Q.rear] = p->lchild;
  60. Q.level[Q.rear] = k + 1;
  61. }
  62. if (p->rchild != NULL) {//右孩子进队列
  63. Q.rear++;
  64. Q.data[Q.rear] = p->rchild;
  65. Q.level[Q.rear] = k + 1;
  66. }
  67. }
  68. max = 0, i = 0;//max保存同一层最多的结点个数
  69. k = 1;//k表示从第一层开始查找
  70. while (i<=Q.rear) {//i扫描队中所有元素
  71. n = 0;//n统计第k层的结点个数
  72. while (i <= Q.rear && Q.level[i] == k) {
  73. n++;
  74. i++;
  75. }
  76. k = Q.level[i];
  77. if (n > max)
  78. max = n;//保存最大的n
  79. }
  80. return max;
  81. }
  82. void leverOrder(BiTree b) {
  83. BiTree p;
  84. BQ Q;
  85. Q.front = Q.rear = -1;//队列为空
  86. Q.rear++;
  87. Q.data[Q.rear] = b;//根结点指针入队
  88. while (Q.front < Q.rear) {
  89. Q.front++;//出队
  90. p = Q.data[Q.front];//出队结点
  91. printf("%c ", p->data);
  92. if (p->lchild != NULL) {//左孩子进队列
  93. Q.rear++;
  94. Q.data[Q.rear] = p->lchild;
  95. }
  96. if (p->rchild != NULL) {//右孩子进队列
  97. Q.rear++;
  98. Q.data[Q.rear] = p->rchild;
  99. }
  100. }
  101. }
  102. int main() {
  103. //创建一棵二叉树
  104. BiTree T = (BiTree)malloc(sizeof(BiNode));//创建一颗二叉树
  105. T = Create(T);
  106. printf("这棵非空二叉树的层序遍历序列:\n");
  107. leverOrder(T);
  108. int btWidth = BTWidth(T);
  109. printf("\n非空二叉树b的宽度(即具有结点数最多的那一层的结点个数)为:%d 个\n", btWidth);
  110. }

过程推演是小编的想法,如有不对的地方,欢迎指正,我将继续制作出更加有质量的博客内容,希望个位小伙伴能够点个赞,这是对我的付出的肯定,谢谢您们!!! 

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

闽ICP备14008679号