当前位置:   article > 正文

C语言二叉树层序遍历--malloc二维数组存储每层结果_malloc returnsize

malloc returnsize

本题来自leetcode 102Binary Tree Level Order Traversal

一、问题描述

给定一个二叉树,返回其节点值的层序遍历。(即从左到右,逐级)
【举例】
给定一个二叉树 [3,9,20,null,null,15,7],
    3
   / \
  9  20
    /  \
   15   7
返回层序遍历:
[
  [3],
  [9,20],
  [15,7]

]

二、解题思路关键点

1、借助队列,实现层序遍历

2、用两个常量记录当前层元素值cur_layer_count和下一层元素值next_layer_count,每次pop出一个元素,当前层元素值减减;直到当前层元素值减到0,说明该层元素输出完毕,则可将层数layer++

3、二维数组的malloc方法:

    int** result = (int**)malloc(layer*sizeof(int*));  //先malloc行

    for( i=0; i<layer; i++ )

        result[i] = (int*)malloc( (*columnSizes)[i]) * sizeof(int)); //再malloc每一行有多少列

4、注意题目中的参数含义:

        ** columnSizes:用于存储层序遍历后每一层的结果的长度
        * returnSize:用于返回一共多少层
        所以最终返回的结果需要一个自定义的二维数组存

三、算法代码

1、队列数据结构定义

  1. /**BFS会用到队列这个数据结构**/
  2. /**循环队列**/
  3. typedef struct
  4. {
  5. struct TreeNode data[1000];
  6. int front; //头指针
  7. int rear; //尾指针,队列非空则指向队尾最后一个元素后一个位置
  8. }SqQueue;
  9. //队列初始化
  10. void InitQueue(SqQueue *Q)
  11. {
  12. Q->front = 0;
  13. Q->rear = 0;
  14. }
  15. //入队
  16. bool EnQueue(SqQueue *Q, struct TreeNode e)
  17. {
  18. //判断队列是否满
  19. if( ( Q->rear+1 ) % 1000 == Q->front )
  20. return false;
  21. Q->data[Q->rear]=e;
  22. Q->rear = (Q->rear+1)%1000;
  23. return true;
  24. }
  25. //出队---删除队首元素,并赋给e
  26. struct TreeNode* DeQueue(SqQueue *Q, struct TreeNode* e)
  27. {
  28. //判断队列是否为空
  29. if( Q->front == Q->rear )
  30. return NULL;
  31. *e = Q->data[Q->front];
  32. Q->front = (Q->front+1)%1000;
  33. return e;
  34. }
  35. //队列判空
  36. bool isEmptyQueue(SqQueue *Q)
  37. {
  38. return Q->front == Q->rear?true:false;
  39. }

2、主算法部分

  1. /******************************************
  2. Author:tmw
  3. date:2018-5-5
  4. ******************************************/
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <stdbool.h>
  8. #include <string.h>
  9. struct TreeNode {
  10. int val;
  11. struct TreeNode *left;
  12. struct TreeNode *right;
  13. };
  14. /**
  15. 二叉树的层序遍历借助队列这个数据结构--原理与BFS一样
  16. ** columnSizes:用于存储层序遍历后每一层的结果的长度
  17. * returnSize:用于返回一共多少层
  18. **/
  19. int** levelOrder(struct TreeNode* root, int** columnSizes, int* returnSize)
  20. {
  21. /**申请并初始化队列**/
  22. SqQueue q;
  23. InitQueue(&q);
  24. int cur_layer_count = 0; /**记录当前层的结点数**/
  25. int next_layer_count = 0; /**记录下一层结点**/
  26. int layer = 0; /**记录层数**/
  27. /**temp数组用于暂时存储每一层的元素个数**/
  28. int* temp = (int*)malloc(1000*sizeof(int));
  29. temp[0] = 1;
  30. /**第一次遍历二叉树:malloc构造对应结果大小的二维数组**/
  31. if( root != NULL )
  32. {
  33. struct TreeNode p; /**承接出队元素**/
  34. /**先将当前结点入队**/
  35. EnQueue(&q,*root);
  36. cur_layer_count++;
  37. /**BFS---构造层序遍历的二维数组**/
  38. while( !isEmptyQueue(&q) )
  39. {
  40. /**将当前队列中的元素出队,并将与其有关联的其他结点入队**/
  41. DeQueue(&q,&p);
  42. cur_layer_count--;
  43. //关联结点入队
  44. if( p.left )
  45. {
  46. EnQueue(&q,*(p.left));
  47. next_layer_count++;
  48. }
  49. if( p.right )
  50. {
  51. EnQueue(&q,*(p.right));
  52. next_layer_count++;
  53. }
  54. if( cur_layer_count == 0 ) //一层已遍历完毕
  55. {
  56. layer++;
  57. printf("%d\n",layer);
  58. temp[layer] = next_layer_count;
  59. cur_layer_count = next_layer_count;
  60. next_layer_count = 0;
  61. }
  62. }
  63. }
  64. /**
  65. 传递层数给形参
  66. ** columnSizes:用于存储层序遍历后每一层的结果的长度
  67. * returnSize:用于返回一共多少层
  68. 所以最终结果需要一个自定义的二维数组存
  69. **/
  70. *returnSize = layer;
  71. *columnSizes = (int*)malloc(layer*sizeof(int));
  72. int i;
  73. for( i=0; i<layer; i++ )
  74. (*columnSizes)[i] = temp[i];
  75. free(temp);
  76. /**最终结果的二维数组---result**/
  77. int** result;
  78. result = (int**)malloc(layer*sizeof(int*));
  79. for( i=0; i<layer; i++ )
  80. result[i] = (int*)malloc((*columnSizes)[i]*sizeof(int));
  81. /**第二次遍历二叉树:将层序结果存入构造好的二维数组result**/
  82. if( root != NULL )
  83. {
  84. struct TreeNode p; /**承接出队元素**/
  85. int cur_layer_count = 0; /**记录当前层的结点数**/
  86. int next_layer_count = 0; /**记录下一层结点**/
  87. int layer = 0; /**记录层数**/
  88. int j=0;
  89. /**先将当前结点入队**/
  90. EnQueue(&q,*root);
  91. cur_layer_count++;
  92. /**BFS---传值**/
  93. while( !isEmptyQueue(&q) )
  94. {
  95. /**将当前队列中的元素出队,并将与其有关联的其他结点入队**/
  96. DeQueue(&q,&p);
  97. cur_layer_count--;
  98. result[layer][j] = p.val;
  99. j++;
  100. /**关联结点入队**/
  101. if( p.left )
  102. {
  103. EnQueue(&q,*(p.left));
  104. next_layer_count++;
  105. }
  106. if( p.right )
  107. {
  108. EnQueue(&q,*(p.right));
  109. next_layer_count++;
  110. }
  111. if( cur_layer_count == 0 ) /**一层已遍历完毕**/
  112. {
  113. layer++; /**当前层遍历完毕后进入下一层**/
  114. cur_layer_count = next_layer_count;
  115. next_layer_count = 0;
  116. j=0; /**下一层的存储从数组0号位置开始**/
  117. }
  118. }
  119. }
  120. /**结果打印**/
  121. int ii,jj;
  122. for(ii=0;ii<layer;ii++)
  123. {
  124. for(jj=0;jj<(*columnSizes)[ii];jj++)
  125. printf("%d ",result[ii][jj]);
  126. printf("\n");
  127. }
  128. return result;
  129. }

四、执行结果

leetcode C accept

                                                                                                              梦想还是要有的,万一实现了呢~~~ヾ(◍°∇°◍)ノ゙~~~



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

闽ICP备14008679号