今天看到这么一个题,要求求出二叉树的深度和度为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