小蚂蚁学习数据结构(24)——求二叉树深度和度为2的节点个数代码实现

    今天看到这么一个题,要求求出二叉树的深度和度为2的节点个数,就写了一下。

# include <stdio.h>
# include <stdlib.h>

//二叉树的节点结构体
typedef struct Tnode
{
	char data;
	struct Tnode * lchild; 
	struct Tnode * rchild;
}NODE, * PTNODE;

typedef int Status;

//定义一个全局变量,用于统计度为2的节点
int count = 0;

# define OK    1
# define ERROR 0

//创建一个二叉树
Status CreatTree( PTNODE & );
//先序遍历二叉树
Status InOrderTraveler( PTNODE & );
//求出树的深度
Status DeepTree( PTNODE & );
//求出树中度为2的节点个数
Status TwoDegreeNode( PTNODE & );

/* 
	先序创建一颗二叉树
	这段代码在前面已经写烂 ~~( ﹁ ﹁ ) ~~~
*/
Status CreatTree( PTNODE & T )
{
	char data;
	scanf( "%c", &data );
	
	if( ' ' == data )
	{
		T = NULL;	//如果是#,说明是一颗空树
	}
	else
	{
		//节点有值,则创建这个节点
		T = ( PTNODE )malloc( sizeof( NODE ) );
		if( NULL == T )
		{
			printf( "节点动态空间分配失败\n" );
			return ERROR;
		}
		T -> data = data;
		CreatTree( T -> lchild );
		CreatTree( T -> rchild );
	}
	return OK;
}

/* 
	先序遍历二叉树 
	同样的,这一段代码也同样是写烂了
	写这段代码的作用是为了检查刚刚那个二叉树生成了没
*/
Status InOrderTraveler( PTNODE &T )
{
	if( NULL != T )
	{
		printf( "%c", T -> data );
		InOrderTraveler( T -> lchild );
		InOrderTraveler( T -> rchild );
	}
	
	return OK;
}

/*
	求出二叉树的深度,这个才是今天的猪脚
*/
int DeepTree( PTNODE & T )
{
	//设置两个整型变量,用于接收左子树和右子树的深度
	int LDeep, RDeep;
	
	if( NULL == T )
	{
		return 0;
	}
	else{
		//递归遍历左右子树,思路跟前中后序遍历二叉树一样一样的
		LDeep = DeepTree( T -> lchild );
		RDeep = DeepTree( T -> rchild );
		/*
			左右子树的深度拿到后,需要比较,把数值更大换句话说,
			就是把深度更深的那个子树拿出来加1.
		*/
		if( LDeep < RDeep )
		{
			return RDeep + 1;
		}
		else
		{
			return LDeep + 1;
		}
	}
}

/*
	求出树中度为2的节点个数
	思路比较简单,就是一个先序遍历二叉树
*/
Status TwoDegreeNode( PTNODE & T )
{
	
	if( NULL == T )
	{
		return 0;
	}
	else
	{
		if( T -> lchild && T -> rchild )
		{
			//因为要进行很多次的递归,所以在这里创建了一个全局变量
			count += 1;
		}
		
		TwoDegreeNode( T -> lchild );
		TwoDegreeNode( T -> rchild );
	}
}

int main( void )
{
	int n;
	//创建一颗指向一棵树的指针
	PTNODE Tree = NULL;
	printf( "先创建一个二叉树,格式 AB  C  \n" );
	CreatTree( Tree );
	
	n = DeepTree( Tree );
	
	printf( "二叉树的深度为:%d\n", n );
	
	TwoDegreeNode( Tree );
	
	printf( "度为2的个数是:%d\n", count );
	
	//InOrderTraveler( Tree );
	//printf( "\n" );
	return 0;
}
/*
	VC++6.0的输出结果为
	================================
	先创建一个二叉树,格式 AB  C
	ABEQ  F   CD
	二叉树的深度为:4
	度为2的个数是:2
	================================
	总结:
		总体说来,无论是求出二叉树的深度,还是求出度为2的节点数量,
		都需要对这颗树进行递归操作。
		求二叉树深度,就是一个后序二叉树遍历,只能使用后序,因为它的前提
		是需要先求出左右子树的深度。
		然后遍历根节点的时候,选择是使用左子树的深度还是右子树的深度。
		求度为2的二叉树同样是对树做了一次遍历,这个感觉上使用先中后序遍历
		都可以。为了递归时候的累加,设置了一个全局变量。
*/


    学PHP的小蚂蚁 博客 http://my.oschina.net/woshixiaomayi/blog



转载于:https://my.oschina.net/woshixiaomayi/blog/609203

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值