关于二叉树的打印问题

写二叉树的的深度的时候,顺便写了二叉树的打印,一般打印都是波兰式或者逆波兰式,看起来太难受,就写了个顺序打印,正好画个二叉树,用队列实现,代码如下:

#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;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值