求二叉树的宽度C语言版

/*层次遍历二叉树,每一层遍历完成以后都重新插入特定的指针
(比如本例使用的特殊指针是数据元素为#,左右儿子为空的指针),
这样在每次访问到所指向数据为#的队列中的结点指针是就知道该指针是这层的末尾,需要统计,
但是又有个问题是,最后队中所剩下的节点指针起数据一定是#,因此会陷入无限循环,解决的方法是,
在发现当前结点指针所指向的结点的数据是#的时候,在查看队列中是否还有元素(节点指针),
如果没有,则说明是最后一层的最后一个结点指针,所以应该跳出循环*/
#include <stdio.h>
#include <malloc.h>
#define M 100

typedef struct BTNode
{
	char data;
	struct BTNode *lchild;
	struct BTNode *rchild;
}BTNode;

typedef struct Queue
{
	BTNode *data[M];
	int f;
	int r;
}Queue;

//创建二叉树(先序方式)
void createTree(BTNode* *T)
{
	char ch = getchar();
	if(ch=='#') 
	{
		*T=NULL;
		return;
	}
	(*T) = (BTNode*)malloc(sizeof(BTNode));
	(*T)->data = ch;
	createTree(&(*T)->lchild);
	createTree(&(*T)->rchild);	
}
 
void preOrder(BTNode *T)//先序遍历
{
	if(T==NULL) return;
	printf("%c	", T->data);
	if(T->lchild!=NULL)
		preOrder(T->lchild);
	if(T->rchild != NULL)
		preOrder(T->rchild);
}

//求二叉树的宽度
int width(BTNode *T)
{
	if(T==NULL) return 0;
	int num = 0;
	int max = 0;
	Queue Q;
	Q.r = 0;
	Q.f = 0;//initialize Queue
	memset(Q.data,NULL,M);
	Q.data[Q.r++] = T;

	BTNode *t = (BTNode*)malloc(sizeof(BTNode));
	t->data = '#';
	t->lchild = NULL;
	t->rchild = NULL;
	Q.data[Q.r++] = t;//enter Queue
	while(Q.r!=Q.f)
	{
		t = Q.data[Q.f++];
		if(t->data=='#')
		{
			if(max<num)
			{
				max = num;
				num = 0;
			}
			if(Q.data[Q.f]!=NULL)
			{
				t = (BTNode*)malloc(sizeof(BTNode));
				t->data = '#';
				t->lchild = NULL;
				t->rchild = NULL;
				Q.data[Q.r++] = t;
			}
			
		}
		else
		{
			++num;
			if(t->lchild) Q.data[Q.r++] = t->lchild;
			if(t->rchild) Q.data[Q.r++] = t->rchild;
		}
	}
	return max;
}

int main(int argc, char const *argv[])
{
	BTNode *T;
	createTree(&T);
	puts("PreOrder visit:");
	preOrder(T);
	putchar('
');

	printf("the width of BTree is %d
",width(T) );
	return 0;
}

原文地址:https://www.cnblogs.com/yldf/p/6249884.html