当前位置:   article > 正文

二叉树之层次遍历_为什么层次遍历输入数据过快会读入不全

为什么层次遍历输入数据过快会读入不全


       下面是对层次遍历的一个实例,如果对二叉树不太了解请点击这里,另外对于二叉树其他的三种遍历方式:请点击这里

任务要求:输入一棵二叉树,进行层次遍历,每个节点都按照从根节点到他的移动序列给出(L表示左,R表示右)。在输入中,每个节点的左右括号之间没有空格,相邻节点之间用一个空格隔开。每棵数的输入用一队空括号 () 表示结束(这对括号本身并不代表一个节点),如图所示。

(画的略丑)

注意:如果从根到某个叶节点的路径上有的节点没有在输入中给出,或者给出超出了一次应当输出 -1.节点数不超过 256.

样例输入:

(11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ()

(3,L) (4,R) ()

样例输出:

5 4 8 11 13 4 7 2 1

-1

代码如下:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define MAXN 1500 + 100
  5. typedef struct TNode //定义树结构
  6. {
  7. bool is_value; //是否被赋值过
  8. int v; //节点值
  9. TNode *left, *right;//左儿子和右儿子
  10. }Node;
  11. Node* root; //二叉树的根节点
  12. bool failed;
  13. int ans[MAXN],cnt;
  14. //功能:申请新节点并初始化
  15. Node* newnode(){
  16. Node* u = (Node*)malloc(sizeof(Node));
  17. if(u != NULL ){
  18. u->is_value = false;
  19. u->left = u->right = NULL;
  20. }
  21. return u;
  22. }
  23. //功能:程序运行结束之前先释放内存
  24. void remove_tree(Node* u){
  25. if(u == NULL) return ;
  26. remove_tree(u->left);
  27. remove_tree(u->right);
  28. free(u);
  29. }
  30. //功能:将给定的序列加入树,若不存在则使用newnode创建新节点
  31. void addnode(int v,char *s){
  32. int nLen = strlen(s);
  33. Node* u = root; //从根节点往下走
  34. for(int i = 0; i < nLen; i++){
  35. if(s[i] == 'L'){
  36. if(u->left == NULL) u->left = newnode(); //节点不存在,建立新节点
  37. u = u->left; //往左走
  38. }else if(s[i] == 'R'){
  39. if(u->right == NULL) u->right = newnode();
  40. u = u->right; //往右走
  41. }
  42. } //忽略其他情况,即最后那个多余的括号
  43. if(u->is_value) failed = true; //已经赋过值,表明输入有误
  44. u->v = v;
  45. u->is_value = true;
  46. }
  47. void input_tree(){
  48. char s[MAXN]; //保存读入节点
  49. failed = false;
  50. root = newnode(); //创建根节点
  51. while(scanf("%s",s),strcmp(s,"()")){ //读到结束标志退出循环
  52. int v;
  53. sscanf(&s[1],"%d",&v); //读入节点值
  54. addnode(v,strchr(s,',')+1); //查找逗号,插入节点
  55. }
  56. return ;
  57. }
  58. bool bfs(){
  59. Node *q[MAXN],*u;
  60. q[0] = root;
  61. int front = 0, rear = 1;
  62. while(front < rear){
  63. u = q[front++];
  64. if(!u->is_value) return false; //没有被赋过值,表明输入有误
  65. ans[cnt++] = u->v; //增加到输出序列的尾部
  66. if(u->left != NULL) q[rear++] = u->left; //把左儿子放入队列
  67. if(u->right != NULL) q[rear++] = u->right;//把右儿子放入队列
  68. }
  69. return true; //输入正确
  70. }
  71. int main(){
  72. while(1){
  73. cnt = 0;
  74. input_tree();
  75. if(!failed&&bfs()){ //判断是否有重复输入或者节点中断
  76. for(int i = 0; i < cnt; i++){ //按照层次遍历输出二叉树
  77. if(i) printf(" ");
  78. printf("%d",ans[i]);
  79. }
  80. printf("\n");
  81. }
  82. else
  83. printf("-1\n");
  84. }
  85. return 0;
  86. }

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

闽ICP备14008679号