求二叉树的最大宽度(每层所含节点的最大数),复制一棵树,度为0,1,2的节点数

typedef struct node {
	char data;
	struct node *lchild, *rchild;
}BiTNode,*BiTree;
/*
	主要采用的时二叉树的层次遍历使用一个简单的队列
	参数:树的根节点
	返回值MaxWidth:树的最大宽度
*/
int MaxBiTreeWidth(BiTree bt) {
	int MaxWidth = 0, num = 0;//MaxWidth存储最大宽度
	BiTree queue[M],p;
	int rear=-1,front=-1;
	queue[++rear] = bt;
	num = rear - front;
	while (rear != front) {
		MaxWidth = MaxWidth > num ? MaxWidth : num;
		while (num > 0) {
			p = queue[++front];
			if (p->lchild)
				queue[++rear] = p->lchild;
			if (p->rchild)
				queue[++rear] = p->rchild;
			num--;
		}
		num = rear - front;
	}
	return MaxWidth;
}
/*
	复制一棵二叉树
*/
BiTree copy(const BiTree bt) {
	BiTree root;
	if(bt==NULL){
		return NULL;
		root = (BiTree)malloc(sizeof(BiTNode));
		root->data = bt->data;
		root->lchild = copy(bt->lchild);
		root->rchild = copy(bt->rchild);
		return root;
}
/*
	二叉树中度为1的节点数
*/
int OneCount(BiTree bt) {
	if (!bt)
		return 0;
	else if ((!bt->lchild&&bt->rchild) || (bt->lchild && !bt->rchild))
		return 1;
	else {
		return OneCount(bt->lchild) + OneCount(bt->rchild);
	}
}
/*
	二叉树中度为2的节点数
*/
int TwoCount(BiTree bt) {
	if (!bt)
		return 0;
	else if ((bt->lchild != NULL && bt->rchild != NULL))
		return TwoCount(bt->lchild) + TwoCount(bt->rchild) + 1;
	else
	{
		return TwoCount(bt->lchild) + TwoCount(bt->rchild);
	}
}
/*
	二叉树中度为0的节点数
*/
int ZeroCount(BiTree bt) {
	if (!bt)
		return 0;
	else if (!bt->lchild && !bt->rchild)
		return 1;
	else
	{
		return ZeroCount(bt->lchild) + ZeroCount(bt->rchild);
	}
}

你可能感兴趣的:(求二叉树的最大宽度(每层所含节点的最大数),复制一棵树,度为0,1,2的节点数)