因为完全二叉树的严格定义,其有非常多的特点和性质,我们创建一般的二叉树时,可将其“填补”成完全二叉树。
创建二叉树(前序遍历的方式建立二叉树):
void CreateBiTree( BiTree *T )
{
char c ;
scanf( "%c" , &c ) ;
if( c == '#' )
*T = NULL ;
else
{
*T = ( BiTNode * )malloc( sizeof( BiTNode ) ) ;
( *T )->ch = c ;
CreateBiTree( &( *T )->lchild ) ;
CreateBiTree( &( *T )->rchild ) ;
}
}
前序遍历:
void PreOrderTraverse( BiTree T )
{
if( T == NULL )
return ;
printf( "%c " , T->ch ) ;
PreOrderTraverse( T->lchild ) ;
PreOrderTraverse( T->rchild ) ;
}
中序遍历:
void InOrderTraverse( BiTree T )
{
if( T == NULL )
return ;
InOrderTraverse( T->lchild ) ;
printf( "%c " ,T->ch ) ;
InOrderTraverse( T->rchild ) ;
}
后序遍历:
void PostOrderTraverse( BiTree T )
{
if( T == NULL )
return ;
PostOrderTraverse( T->lchild ) ;
PostOrderTraverse( T->rchild ) ;
printf( "%c " , T->ch ) ;
}
计算二叉树的深度:
int DeepTree( BiTree T )
{
if( T == NULL )
return 0 ;
int ldeep , rdeep , deep = 0 ;
ldeep = DeepTree( T->lchild ) ;
rdeep = DeepTree( T->rchild ) ;
deep = ( ldeep > rdeep ? ldeep : rdeep ) ;
return ( deep + 1 ) ;
}
计算叶子节点个数:
int SumLeaves( BiTree T )
{
if( T == NULL )
return 0 ;
if( T->lchild == NULL && T->rchild == NULL )
return 1 ;
return ( SumLeaves( T->lchild ) + SumLeaves( T->rchild ) ) ;
}
计算节点个数:
int SumNode( BiTree T )
{
if( T == NULL )
return 0 ;
return ( 1 + ( SumNode( T->lchild ) ) + ( SumNode( T->rchild ) ) ) ;
}
源代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct BiTNode
{
char ch ;
struct BiTNode *lchild , *rchild ;
}BiTNode , *BiTree ;
void CreateBiTree( BiTree *T ) ;
void PreOrderTraverse( BiTree T ) ;
void InOrderTraverse( BiTree T ) ;
void PostOrderTraverse( BiTree T ) ;
int SumLeaves( BiTree T ) ;
int SumNode( BiTree T ) ;
int DeepTree( BiTree T ) ;
int main( void )
{
BiTree T ;
printf( "输入要创建的拓展二叉树的前序遍历结果:\n") ;
//ABD###CE##F##
//ABDJ##B##E##C#F##
CreateBiTree( &T ) ;
printf( "前序遍历:" ) ;
PreOrderTraverse( T ) ; printf( "\n" ) ;
printf( "中序遍历:" ) ;
InOrderTraverse( T ) ; printf( "\n" ) ;
printf( "后序遍历:" ) ;
PostOrderTraverse( T ) ; printf( "\n" ) ;
printf( "二叉树的叶子节点个数是:%d\n" , SumLeaves( T ) ) ;
printf( "二叉树的结点总数是:%d\n" , SumNode( T ) ) ;
printf( "二叉树的深度为:%d\n" , DeepTree( T ) ) ;
return 0 ;
}
void CreateBiTree( BiTree *T )
{
char c ;
scanf( "%c" , &c ) ;
if( c == '#' )
*T = NULL ;
else
{
*T = ( BiTNode * )malloc( sizeof( BiTNode ) ) ;
( *T )->ch = c ;
CreateBiTree( &( *T )->lchild ) ;
CreateBiTree( &( *T )->rchild ) ;
}
}
void PreOrderTraverse( BiTree T )
{
if( T == NULL )
return ;
printf( "%c " , T->ch ) ;
PreOrderTraverse( T->lchild ) ;
PreOrderTraverse( T->rchild ) ;
}
void InOrderTraverse( BiTree T )
{
if( T == NULL )
return ;
InOrderTraverse( T->lchild ) ;
printf( "%c " ,T->ch ) ;
InOrderTraverse( T->rchild ) ;
}
void PostOrderTraverse( BiTree T )
{
if( T == NULL )
return ;
PostOrderTraverse( T->lchild ) ;
PostOrderTraverse( T->rchild ) ;
printf( "%c " , T->ch ) ;
}
int SumLeaves( BiTree T )
{
if( T == NULL )
return 0 ;
if( T->lchild == NULL && T->rchild == NULL )
return 1 ;
return ( SumLeaves( T->lchild ) + SumLeaves( T->rchild ) ) ;
}
int DeepTree( BiTree T )
{
if( T == NULL )
return 0 ;
int ldeep , rdeep , deep = 0 ;
ldeep = DeepTree( T->lchild ) ;
rdeep = DeepTree( T->rchild ) ;
deep = ( ldeep > rdeep ? ldeep : rdeep ) ;
return ( deep + 1 ) ;
}
int SumNode( BiTree T )
{
if( T == NULL )
return 0 ;
return ( 1 + ( SumNode( T->lchild ) ) + ( SumNode( T->rchild ) ) ) ;
}
-----------参考资料《大话数据结构》,博客二叉树二叉链表的建立和应用。