C语言 - 【二叉树操作】计算二叉树中度数为X(0、1、2)的节点数

首先提到计数,因为是对节点属性的判断,而刚刚好二叉树的遍历算法直接访问了整棵树,所以:

对于节点数的计算,本篇文章会分别给出两种方法:

1 . 在递归遍历的基础上进行计数

2 . 在非递归遍历的基础上进行计数

************************************************************************************************************************************

 

一:在递归遍历的基础上进行计数

除非你十分清楚递归的所有流程,所以在递归函数中一般不给函数带上返回值,因为递归的过程可能会打乱return最终带出的数据。

这里我们可以定义三个全局变量,然后在递归过程中分别对其讨论外加计数:

int count_0 = 0;
int count_1 = 0;
int count_2 = 0;

int Traverse_Bitree_0(BiTreeNode *T)
{
	int count_0 = 0;

	if (T == NULL)
	{
		return 0;
	}
	printf("%c\n", T->data);
	if (T->lchild == NULL&&T->rchild == NULL)
		count_0++;
	if (T->lchild == NULL&&T->rchild != NULL || T->lchild != NULL&&T->rchild == NULL)
		count_1++;
	if (T->lchild != NULL&&T->rchild != NULL)
	{
		count_2++;
	}
	Traverse_Bitree_0(T->lchild);
	Traverse_Bitree_0(T->rchild);
	return count_0;
}

最后可以直接在主函数中调用这些全局变量并输出它们的值。

但是这里要使用全局变量,虽然代码量很少,但并不推荐这种方法,接下来会介绍在非递归遍历过程中,利用函数的返回值

将节点数带出。

 

 

二:在非递归遍历的基础上进行计数

对于一种的全局变量方式,在这里也是可以使用的,但这里主要讲解使用函数的返回值带出节点数;

但是一个函数只能带出一个节点数,所以我们可以定义三个函数来实现三种计数功能(原理一致),

这里给出计算度数为0的节点的个数的算法:

int Traverse_Bitree_1(BiTreeNode *T)
{
	int count_0 = 0;

	BiTreeNode *Stack[100],*p(T);
	int top = 0;
	while (p || top != 0)
	{
		while(p)
		{
			Stack[top] = p;
			top++;

			if (p->lchild == NULL&&p->rchild == NULL)
				count_0++;
			/*if (T->lchild == NULL&&T->rchild != NULL || T->lchild != NULL&&T->rchild == NULL)
				count_1++;
			if (T->lchild != NULL&&T->rchild != NULL)
				count_2++;*/

			//printf("%c", p->data);
			p = p->lchild;
		}
		if (top)
		{
			top--;
			p = Stack[top];
			//printf("%c", p->data);
			p = p->rchild;
		}
	}
	return count_0;
}

 

 

 

三:测试源码(调试使用)

#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
#include 
#include 
using namespace std;

typedef struct Node
{
	char data;
	struct Node *lchild,*rchild;
}BiTreeNode;

void CreatBiTree(BiTreeNode **T)
{
	char ch;
	scanf("%c",&ch);    // 123##4##5##
	if (ch == '#')
	{
		*T = NULL;
	}
	else
	{
		if (!((*T) = (BiTreeNode*)malloc(sizeof(BiTreeNode))))
		{
			exit(0);
		}
		(*T)->data = ch;
		CreatBiTree(&(*T)->lchild);
		CreatBiTree(&(*T)->rchild);
	}
	
}
//
//int count_0 = 0;
//int count_1 = 0;
//int count_2 = 0;
//
//int Traverse_Bitree_0(BiTreeNode *T)
//{
//	if (T == NULL)
//	{
//		return 0;
//	}
//	printf("%c\n", T->data);
//	if (T->lchild == NULL&&T->rchild == NULL)
//		count_0++;
//	if (T->lchild == NULL&&T->rchild != NULL || T->lchild != NULL&&T->rchild == NULL)
//		count_1++;
//	if (T->lchild != NULL&&T->rchild != NULL)
//	{
//		count_2++;
//	}
//	Traverse_Bitree_0(T->lchild);
//	Traverse_Bitree_0(T->rchild);
//	return count_0;
//}

int Traverse_Bitree_1(BiTreeNode *T)
{
	int count_0 = 0;

	BiTreeNode *Stack[100],*p(T);
	int top = 0;
	while (p || top != 0)
	{
		while(p)
		{
			Stack[top] = p;
			top++;

			if (p->lchild == NULL&&p->rchild == NULL)
				count_0++;
			/*if (T->lchild == NULL&&T->rchild != NULL || T->lchild != NULL&&T->rchild == NULL)
				count_1++;
			if (T->lchild != NULL&&T->rchild != NULL)
				count_2++;*/

			//printf("%c", p->data);
			p = p->lchild;
		}
		if (top)
		{
			top--;
			p = Stack[top];
			//printf("%c", p->data);
			p = p->rchild;
		}
	}
	return count_0;
}

//void Traverse_BiTree_2(BiTreeNode *T)
//{
//	pSeqStack S;
//	BiTreeNode *p(T);
//	S = Init_SeqStack();
//	while (p || Empty_SeqStack(S))    //为空返回0
//	{
//		/*if (p)
//		{
//			printf("%c", p->data);
//			Push_SeqStack(S, p);
//			p = p->link;
//		}
//		else
//		{
//			Pop_SeqStack(S, &p);
//			p = p->rchild;
//		}*/
//		while (p)
//		{
//			printf("%c", p->data);
//			Push_SeqSatck(S, p);
//			p = p->lchild;
//		}
//		if (Empty_SeqStack(S))
//		{
//			Pop_SeqStack(S, &p);
//			p = p->rchild;
//		}
//	}
//}

int main()
{
	BiTreeNode *T;
	CreatBiTree(&T);
	int count_0 = Traverse_Bitree_1(T);
	cout << "Count_0 = " << count_0 << endl;
	//cout << "Count_1 = " << count_1 << endl;
	//cout << "Count_2 = " << count_2 << endl;
	return 0;
}

 

 

 

 

你可能感兴趣的:(C)