• 二叉树的自下而上、从右到左的层次遍历算法实现


    问题: 

    1. 首先,先了解什么是层序遍历,试着编写层序遍历的代码。

    层序遍历是自上而下,从左到右的遍历二叉树。 

    1. void LevelOrder(BiTree bt) {
    2. SqQueue Q;
    3. BiNode* p;
    4. if (bt != NULL) {
    5. InitQueue(Q);//队列初始化,队列中存放二叉树结点的指针
    6. EnQueue(Q, bt);
    7. while (QIsEmpty(Q) == false) {//从上而下层次遍历
    8. DeQueue(Q, p);
    9. visit(p->data);
    10. if (p->lchild)
    11. EnQueue(Q, p->lchild);//若左子女不空,则入队列
    12. if (p->rchild)
    13. EnQueue(Q, p->rchild);//若右子女不空,则入队列
    14. }
    15. }//if结束
    16. }

    2.解决题目的思路

     

    1. void InvertLevel(BiTree bt) {
    2. SqStack S;
    3. SqQueue Q;
    4. BiNode* p;
    5. if (bt != NULL) {
    6. InitStack(S);//栈初始化,栈中存放二叉树结点的指针
    7. InitQueue(Q);//队列初始化,队列中存放二叉树结点的指针
    8. EnQueue(Q, bt);
    9. while (QIsEmpty(Q) == false) {//从上而下层次遍历
    10. DeQueue(Q, p);
    11. Push(S, p);//出队,入栈
    12. if (p->lchild)
    13. EnQueue(Q, p->lchild);//若左子女不空,则入队列
    14. if (p->rchild)
    15. EnQueue(Q, p->rchild);//若右子女不空,则入队列
    16. }
    17. while (IsEmpty(S) == false) {
    18. Pop(S, p);
    19. visit(p->data);
    20. }//自下而上,从右到左的层次遍历
    21. }//if结束
    22. }

    3.完整代码:

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. #define MaxSize 100
    6. typedef int ElemType;
    7. typedef struct BiNode {
    8. ElemType data;
    9. BiNode* lchild;
    10. BiNode* rchild;
    11. }BiNode, *BiTree;
    12. //构建二叉树
    13. BiNode* Create(BiNode* bt) {
    14. static int i = 0;
    15. char ch;
    16. //string str = "AB#D##C##";
    17. //string str = "124##56##7##3##";
    18. string str = "ABD#G##E##CF###";
    19. ch = str[i++];
    20. if (ch == '#')bt = NULL;//建立一棵空树
    21. else {
    22. bt = (BiTree)malloc(sizeof(BiNode)); bt->data = ch;//生成一个结点,数据域为ch
    23. bt->lchild = Create(bt->lchild);//递归建立左子树
    24. bt->rchild = Create(bt->rchild);//递归建立右子树
    25. }
    26. return bt;
    27. }
    28. void visit(int x) {
    29. printf("%c ", x);
    30. }
    31. typedef struct {
    32. BiTree data[MaxSize];//存放栈中元素
    33. int top;//栈顶指针
    34. }SqStack;
    35. //(1)初始化
    36. void InitStack(SqStack& S) {
    37. S.top = -1;//初始化栈顶指针
    38. }
    39. //(2)判栈空
    40. bool IsEmpty(SqStack& S) {
    41. if (S.top == -1) {//栈空
    42. return true;
    43. }
    44. else {//不空
    45. return false;
    46. }
    47. }
    48. //(3)进栈
    49. bool Push(SqStack& S, BiTree& p) {
    50. if (S.top == MaxSize - 1) {//栈满,报错
    51. return false;
    52. }
    53. S.data[++S.top] = p;//指针先加1,再加入栈
    54. return true;
    55. }
    56. //(4)出栈
    57. bool Pop(SqStack& S, BiTree& p) {
    58. if (S.top == -1) {//栈空,报错
    59. return false;
    60. }
    61. p = S.data[S.top--];//先出栈,指针再减1
    62. return true;
    63. }
    64. //(5)读栈顶元素
    65. bool GetTop(SqStack& S, BiTree& p) {
    66. if (S.top == -1) {//栈空,报错
    67. return false;
    68. }
    69. p = S.data[S.top];//先出栈,指针再减1
    70. return true;
    71. }
    72. typedef struct {
    73. BiTree data[MaxSize];//存放队列元素
    74. int front, rear;//队头指针和队尾指针
    75. }SqQueue;
    76. //循环队列的操作
    77. //初始化
    78. void InitQueue(SqQueue &Q) {
    79. Q.rear = Q.front = 0;//初始化队首、队尾指针
    80. }
    81. //判断队空
    82. bool QIsEmpty(SqQueue Q) {
    83. if (Q.rear == Q.front) {//队空条件
    84. return true;
    85. }
    86. else {
    87. return false;
    88. }
    89. }
    90. //入队
    91. bool EnQueue(SqQueue &Q, BiTree &p) {
    92. if ((Q.rear + 1) % MaxSize == Q.front)//队满则报错
    93. return false;
    94. Q.data[Q.rear] = p;
    95. Q.rear = (Q.rear + 1) % MaxSize;//队尾指针加1取模
    96. return true;
    97. }
    98. //出队
    99. bool DeQueue(SqQueue& Q, BiTree& p) {
    100. if (Q.rear == Q.front)//队空则报错
    101. return false;
    102. p = Q.data[Q.front];
    103. Q.front = (Q.front + 1) % MaxSize;//队头指针加1取模
    104. return true;
    105. }
    106. void LevelOrder(BiTree bt) {
    107. SqQueue Q;
    108. BiNode* p;
    109. if (bt != NULL) {
    110. InitQueue(Q);//队列初始化,队列中存放二叉树结点的指针
    111. EnQueue(Q, bt);
    112. while (QIsEmpty(Q) == false) {//从上而下层次遍历
    113. DeQueue(Q, p);
    114. visit(p->data);
    115. if (p->lchild)
    116. EnQueue(Q, p->lchild);//若左子女不空,则入队列
    117. if (p->rchild)
    118. EnQueue(Q, p->rchild);//若右子女不空,则入队列
    119. }
    120. }//if结束
    121. }
    122. void InvertLevel(BiTree bt) {
    123. SqStack S;
    124. SqQueue Q;
    125. BiNode* p;
    126. if (bt != NULL) {
    127. InitStack(S);//栈初始化,栈中存放二叉树结点的指针
    128. InitQueue(Q);//队列初始化,队列中存放二叉树结点的指针
    129. EnQueue(Q, bt);
    130. while (QIsEmpty(Q) == false) {//从上而下层次遍历
    131. DeQueue(Q, p);
    132. Push(S, p);//出队,入栈
    133. if (p->lchild)
    134. EnQueue(Q, p->lchild);//若左子女不空,则入队列
    135. if (p->rchild)
    136. EnQueue(Q, p->rchild);//若右子女不空,则入队列
    137. }
    138. while (IsEmpty(S) == false) {
    139. Pop(S, p);
    140. visit(p->data);
    141. }//自下而上,从右到左的层次遍历
    142. }//if结束
    143. }
    144. int main() {
    145. //创建一棵二叉树
    146. BiTree T = (BiTree)malloc(sizeof(BiNode));//创建一颗二叉树
    147. T = Create(T);
    148. //自上而下、从左到右的层序遍历
    149. printf("自上而下、从左到右的层序遍历 \n");
    150. LevelOrder(T);
    151. printf("\n自下而上、从右到左的层序遍历 \n");
    152. //自下而上、从右到左的层序遍历
    153. InvertLevel(T);
    154. }

    4.实验截图

  • 相关阅读:
    我们要不要使用 ORM?
    Web3 用例全解析:传统品牌加速进入 Web3 的原因?
    高项_第十二章项目采购管理
    糖尿病患者应避免这三种食物。
    H5 微信扫一扫
    LeetCode 0593. 有效的正方形
    spark sql保存hive表时的压缩设置
    2024普通人怎么赚钱?2024普通人做什么行业赚钱?2024普通人最有前景的项目!2024普通人怎么搞钱?
    C++ 用sort和unique实现数据的去重
    成功解决ImportError: cannot import name ‘_validate_lengths‘
  • 原文地址:https://blog.csdn.net/weixin_41987016/article/details/127984365