zoukankan      html  css  js  c++  java
  • 二叉树按层次遍历广度优先算法Debug日志

     1 #include"BiThrTree.h"
     2 #include"LinkQueue.h"
     3 
     4 
     5 /*算法:第一步:定义一个存储树结点的队列;第二步:将树的根结点压人队列;
     6 第三步:循环输出队列首结点的存储的树结点的值,直到队列为空,并将输出的结点删除,同时将其左右孩子结点入队列*/
     7 
     8 Status Layer_Traverse(BiThrTree n)
     9 {
    10     //BiThrTree n;//定义一个树的头节点
    11     LinkQueue *q;//队列q
    12     QElemType *c;
    13    // n=p;
    14 
    15 
    16     if(!InitQueue(q))//如果队列初始化失败,则返回错误
    17         return ERROR;
    18     if(n!=NULL)//树非空时,树节点入队列
    19         EnQueue(q,*n);
    20     else return ERROR;
    21     c=&(q->front->data);
    22     while(q->front!=q->rear)//当队列非空时,执行循环
    23     {
    24 
    25         DeQueue(q,c);//获得队列中第一个结点的值,并删除该结点
    26         printf("%c ",c->data);//输出刚刚获得的值
    27         if(c->lchild!=NULL) EnQueue(q,*(c->lchild));//将刚刚删除结点的左右孩子入队列
    28         if(c->rchild!=NULL) EnQueue(q,*(c->rchild));
    29     }
    30     return OK;
    31 
    32 }
    33 
    34 
    35 int main()
    36 {
    37     BiThrTree T;
    38     printf("请按前序输入二叉树(如:'ABDH##I##EJ###CF##G##')\n");
    39     CreateBiThrTree(&T); /* 按前序产生二叉树  */
    40 
    41 
    42     printf("按层遍历:");
    43     Layer_Traverse(T);
    44 
    45 
    46 
    47     return 0;
    48 }
     1 #include "string.h"
     2 #include "stdio.h"
     3 #include "stdlib.h"
     4 #include "io.h"
     5 #include "math.h"
     6 #include "time.h"
     7 
     8 #define OK 1
     9 #define ERROR 0
    10 #define TRUE 1
    11 #define FALSE 0
    12 
    13 #define MAXSIZE 100 /* 存储空间初始分配量  */
    14 
    15 typedef int Status;  /* Status是函数的类型,其值是函数结果状态代码,如OK等  */
    16 typedef char TElemType;
    17 typedef enum {Link,Thread} PointerTag;  /* Link==0表示指向左右孩子指针, */
    18                     /* Thread==1表示指向前驱或后继的线索  */
    19 typedef    struct BiThrNode  /* 二叉线索存储结点结构  */
    20 {
    21   TElemType data;  /* 结点数据  */
    22   struct BiThrNode *lchild, *rchild;  /* 左右孩子指针  */
    23   PointerTag LTag;
    24   PointerTag RTag;    /* 左右标志  */
    25 } BiThrNode, *BiThrTree;
    26 
    27 TElemType Nil='#'; /* 字符型以空格符为空  */
    28 
    29 
    30 
    31 /* 按前序输入二叉线索树中结点的值,构造二叉线索树T */
    32 /* 0(整型)/空格(字符型)表示空结点  */
    33 Status CreateBiThrTree(BiThrTree *T)
    34 {
    35   TElemType h;
    36   scanf("%c",&h);
    37 
    38   if(h==Nil)
    39     *T=NULL;
    40   else
    41   {
    42     *T=(BiThrTree)malloc(sizeof(BiThrNode));
    43     if(!*T)
    44       exit(OVERFLOW);
    45     (*T)->data=h; /* 生成根结点(前序) */
    46     CreateBiThrTree(&(*T)->lchild); /* 递归构造左子树  */
    47     if((*T)->lchild) /* 有左孩子  */
    48       (*T)->LTag=Link;
    49     CreateBiThrTree(&(*T)->rchild); /* 递归构造右子树  */
    50     if((*T)->rchild) /* 有右孩子  */
    51       (*T)->RTag=Link;
    52   }
    53   return OK;
    54 }
     1 //typedef int Status;
     2 
     3 typedef BiThrNode QElemType; /* QElemType类型根据实际情况而定,这里假设为int */
     4 
     5 typedef struct QNode  /* 结点结构  */
     6 {
     7    QElemType data;
     8    struct QNode *next;
     9 }QNode,*QueuePtr;
    10 
    11 typedef struct     /* 队列的链表结构  */
    12 {
    13    QueuePtr front,rear; /* 队头、队尾指针  */
    14 }LinkQueue;
    15 
    16 
    17 
    18 /* 构造一个空队列Q */
    19 Status InitQueue(LinkQueue *Q)
    20 {
    21   Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));
    22   if(!Q->front)
    23     exit(OVERFLOW);
    24   Q->front->next=NULL;
    25   return OK;
    26 }
    27 
    28 
    29 /* 若Q为空队列,则返回TRUE,否则返回FALSE */
    30 Status QueueEmpty(LinkQueue Q)
    31 {
    32   if(Q.front==Q.rear)
    33     return TRUE;
    34   else
    35     return FALSE;
    36 }
    37 
    38 
    39 
    40 /* 若队列不空,则用e返回Q的队头元素,并返回OK,否则返回ERROR */
    41 Status GetHead(LinkQueue Q,QElemType *e)
    42 {
    43   QNode *p;
    44   if(Q.front==Q.rear)
    45     return ERROR;
    46 
    47   printf("break6");
    48 
    49   p=Q.front->next;
    50 
    51   printf("break8");
    52 
    53   e=&(p->data);
    54 
    55   printf("break9");
    56 
    57   return OK;
    58 }
    59 
    60 
    61 /* 插入元素e为Q的新的队尾元素  */
    62 Status EnQueue(LinkQueue *Q,QElemType e)
    63 {
    64   QueuePtr s=(QueuePtr)malloc(sizeof(QNode));
    65   if(!s) /*  存储分配失败  */
    66     exit(OVERFLOW);
    67   s->data=e;
    68   s->next=NULL;
    69   Q->rear->next=s;  /* 把拥有元素e的新结点s赋值给原队尾结点的后继,见图中①  */
    70   Q->rear=s;    /* 把当前的s设置为队尾结点,rear指向s,见图中②  */
    71   return OK;
    72 }
    73 
    74 /* 若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR */
    75 Status DeQueue(LinkQueue *Q,QElemType *e)
    76 {
    77   QueuePtr p;
    78   if(Q->front==Q->rear)
    79     return ERROR;
    80   p=Q->front->next;    /* 将欲删除的队头结点暂存给p,见图中①  */
    81   *e=p->data;        /* 将欲删除的队头结点的值赋值给e */
    82   Q->front->next=p->next;/* 将原队头结点的后继p->next 赋值给头结点后继,见图中②
    83 */
    84   if(Q->rear==p)   /* 若队头就是队尾,则删除后将rear指向头结点,见图中③  */
    85     Q->rear=Q->front;
    86   free(p);
    87   return OK;
    88 }

    上面三个文件依次是Layer_Traverse.c,BiThrTree.h和LinkQueue.h

    算法思路很简单,代码中有说明,之前,程序编译链接都能通过,但是运行的时候,无法输出预想的结果并且报错、终止。调试了一上午,发现是Layer_Traverse函数中定义的变量c没有初始化造成的,于是加了第21行(Layer_Traverse.c中),运行可输出预想结果。

    但是还有个问题,Layer_Traverse函数中变量q在编译时也有警告:没有初始化。不知道怎样解决,希望哪位明白的话,可以告诉我,谢谢!

  • 相关阅读:
    leetcode——832. 翻转图像
    leetcode——830. 较大分组的位置
    leetcode——1089.复写零
    leetcode——86. 分隔链表
    leetcode——387. 字符串中的第一个唯一字符
    leetcode——389. 找不同
    leetcode——61. 旋转链表
    leetcode——24. 两两交换链表中的节点
    leetcode——817. 链表组件
    leetcode——234. 回文链表
  • 原文地址:https://www.cnblogs.com/xmkk/p/2983564.html
Copyright © 2011-2022 走看看