二叉树打印
寒夜凌晨还在写着代码总觉得没啥好开头,随便说两句吧,城市很大,找不着方向,唯一能做的就是一路勇敢奋斗前行。
题:要求用层次遍历二叉树,并且每行输出一层。
分析:层次遍历二叉树是基础的,主要是考虑什么时候换行即可。思路:使用两个变量,一个记录当前层还剩多少个未输出,另 一个记录下一层结点个数。当当前层未输出个数为0时,即输入换行。
首先在进行层次遍历时,对某一层的结点访问完后,再按照访问它们的次序对各个结点的左,右孩子顺序访问,这样一层一层进行。先访问的结点其左右孩子也要先进行访问。这里使用一个队列来接受数据。先将根结点进队,在队列不为空时循环:在队列中出列一个结点*p,访问它,如果有左孩子结点,将其左孩子进队,若它有右孩子结点,将其右孩子结点进队。直到队空。代码算法如下:
//树的基本结构 typedef char DataType; typedef struct tnode{ DataType data; struct tnode *lchild,*rchild; }BT; //层次遍历二叉树 void LevelOrder(BT *T){ int f,r; //定义队头队尾指针 BT *p,*q[MAX]; //定义循环队列,存放结点指针 p=T; if(p!=NULL){ f = 1; q[f] = p; r = 2; i = 1; j = 0; } while(f!=r){ p = q[f]; printf("%c",p->data); if(--i==0){ printf("\n"); } if(p->lchild!=NULL){ q[r]=p->lchild; r=(r+1)%MAX; j++; } if(p->rchild!=NULL){ q[r]=p->rchild; r=(r+1)%MAX; j++; } f=(f+1)%MAX; i = j; j = 0; } }
以上算法打印出来是没有换行的,所以达不到题目的要求,下面继续分析如何解决题目。按照思路中使用两个变量后。第一个变量即记录当前层还剩几个未输出,每输出一个变量减1.当变量为0输出"\n"。第二个变量即访问的结点有左孩子时加1,有右孩子时也加1。在访问某一结点后判断是否已经当前层输出完毕是则把第二个变量赋给第一次变量。第二个变量赋为0.(主要下代码*处)。
1 void LevelOrder(BT *T){ 2 int f,r; //定义队头队尾指针 3 int i,j; //i:记录当前还剩多少个未打印 j:下一层结点数 4 BT *p,*q[MAX]; //定义循环队列,存放结点指针 5 p=T; 6 if(p!=NULL){ 7 f = 1; 8 q[f] = p; 9 r = 2; 10 i = 1; 11 j = 0; 12 } 13 while(f!=r){ 14 p = q[f]; 15 printf("%c",p->data); 16 17 if(p->lchild!=NULL){ 18 q[r]=p->lchild; 19 r=(r+1)%MAX; 20 j++; 21 } 22 if(p->rchild!=NULL){ 23 q[r]=p->rchild; 24 r=(r+1)%MAX; 25 j++; 26 } 27 f=(f+1)%MAX; 28 if(--i==0){ 29 printf("\n");//*** 30 i = j; //*** 31 j = 0; //*** 32 } 33 } 34 }
即可解决。测试通过。