写二叉树的的深度的时候,顺便写了二叉树的打印,一般打印都是波兰式或者逆波兰式,看起来太难受,就写了个顺序打印,正好画个二叉树,用队列实现,代码如下:
#include<stdio.h>
#include<malloc.h>
#include<math.h>
typedef char TElemType;
typedef struct BiTNode {
TElemType data;
struct BiTNode* lchild, * rchild;
}BiTNode,*BiTree;//树的节点
typedef BiTNode* STElemType;
typedef struct QNodeT {
STElemType data;
struct QNodeT* next;
}QNodeT, * QueueTPtr;//队列的节点
typedef struct {
QueueTPtr front;
QueueTPtr rear;
}LinkQueueT;//队列
void QueueTInit(LinkQueueT& Q);//队列初始化
void QueueTInsert(LinkQueueT& Q, STElemType e);//队列插入
STElemType QueueTDelete(LinkQueueT& Q);//队列删除并返回
int QueueTLength(LinkQueueT Q);//队列长度
void CreateBitree(BiTree& T);//先序创建二叉树
void TreeDispalyone(TElemType e, int n);//单个节点打印
void TreeDispaly(BiTree T);//打印
int TreeDepth(BiTree T);//递归求二叉树的深度
void CreateBitree(BiTree& T) {
char ch = getchar();
if (ch=='#') {
T = NULL;
return;
}else{
T = (BiTree)malloc(sizeof(BiTNode));
T->data = ch;
CreateBitree(T->lchild);
CreateBitree(T->rchild);
}
}
int TreeDepth(BiTree T) {
if (!T) return 0;
int DepthL = 0;
int DepthR = 0;
DepthL = TreeDepth(T->lchild);
DepthR = TreeDepth(T->rchild);
return DepthL > DepthR ? DepthL + 1 : DepthR + 1;
}
void TreeDispalyone(TElemType e, int n) {
for (int i = 0; i < n; i++) {
printf(" ");
}
printf("%c", e);
}
void QueueTInit(LinkQueueT& Q) {
QueueTPtr node = (QueueTPtr)malloc(sizeof(QNodeT));
node->next = NULL;
Q.front = node;
Q.rear = node;
}
void QueueTInsert(LinkQueueT& Q, STElemType e) {
QueueTPtr node = (QueueTPtr)malloc(sizeof(QNodeT));
Q.rear->data = e;
node->next = Q.rear->next;
Q.rear->next = node;
Q.rear = node;
}
STElemType QueueTDelete(LinkQueueT& Q) {
if (Q.front == Q.rear) {
return 0;
}
QueueTPtr s;
STElemType data;
data = Q.front->data;
s = Q.front;
Q.front = Q.front->next;
free(s);
return data;
}
int QueueTLength(LinkQueueT Q) {
int count = 0;
while (Q.front != Q.rear){
count++;
Q.front = Q.front->next;
}
return count;
}
void TreeDispaly(BiTree T) {
int Depth = TreeDepth(T);
int count = 1;//二叉树的当前层数
LinkQueueT Queue;
QueueTInit(Queue);
QueueTInsert(Queue, T);//根节点入队列
printf("打印树:\n");
while (count<Depth+1)
{
int length = QueueTLength(Queue);//每层的节点个数
for (int i = 0; i < length; i++)
{
T = QueueTDelete(Queue);
if (T) {//T存在打印
if (i == 0) TreeDispalyone(T->data, pow(2, Depth - count) - 1);
else TreeDispalyone(T->data, pow(2, Depth - count+1) - 1);
QueueTInsert(Queue, T->lchild);
QueueTInsert(Queue, T->rchild);
}else{//T不存在,则打印空字符,将俩个NULL入队列
if (i == 0) TreeDispalyone(' ', pow(2, Depth - count) - 1);
else TreeDispalyone(' ', pow(2, Depth - count+1) - 1);
QueueTInsert(Queue, NULL);
QueueTInsert(Queue, NULL);
}
}
printf("\n");
count++;//换层
}
}
int main(){
BiTree T;
CreateBitree(T);
TreeDispaly(T);
return 0;
}