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

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

# include 

# include 

//二叉树的节点结构体

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 

{

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的二叉树同样是对树做了一次遍历,这个感觉上使用先中后序遍历

都可以。为了递归时候的累加,设置了一个全局变量。

*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值