二叉树的链式存储
结点结构
typedef char CElemType;
typedef struct BiTNode
{
CElemType data;
struct BiTNode * lchild, * rchild;
} BiTNode, * BiTree;
访问结点的函数
Status visit ( CElemType e)
{
printf ( "%c " , e) ;
return OK;
}
构建空二叉树
Status InitBiTree ( BiTree * T)
{
* T= NULL ;
return OK;
}
创建二叉树
void CreateBiTree ( BiTree * T) {
char c;
scanf ( "%c" , & c) ;
if ( '#' == c) {
* T = NULL ;
} else {
* T = ( BiTNode * ) malloc ( sizeof ( BiTNode) ) ;
if ( ! * T) {
exit ( OVERFLOW) ;
}
( * T) -> data = c;
CreateBiTree ( & ( * T) -> lchild) ;
CreateBiTree ( & ( * T) -> rchild) ;
}
}
销毁二叉树
void DestroyBiTree ( BiTree * T)
{
if ( * T)
{
if ( ( * T) -> lchild)
DestroyBiTree ( & ( * T) -> lchild) ;
if ( ( * T) -> rchild)
DestroyBiTree ( & ( * T) -> rchild) ;
free ( * T) ;
* T= NULL ;
}
}
二叉树的深度
int BiTreeDepth ( BiTree T) {
int i, j;
if ( ! T)
return 0 ;
if ( T-> lchild)
i= BiTreeDepth ( T-> lchild) ;
else
i= 0 ;
if ( T-> rchild)
j= BiTreeDepth ( T-> rchild) ;
else
j= 0 ;
return i> j? i+ 1 : j+ 1 ;
}
前序遍历二叉树
void PreOrderTraverse ( BiTree T)
{
if ( T== NULL )
return ;
visit ( T-> data) ;
PreOrderTraverse ( T-> lchild) ;
PreOrderTraverse ( T-> rchild) ;
}
中序遍历
void InOrderTraverse ( BiTree T)
{
if ( T== NULL )
return ;
InOrderTraverse ( T-> lchild) ;
visit ( T-> data) ;
InOrderTraverse ( T-> rchild) ;
}
后序遍历
void PostOrderTraverse ( BiTree T)
{
if ( T== NULL )
return ;
PostOrderTraverse ( T-> lchild) ;
PostOrderTraverse ( T-> rchild) ;
visit ( T-> data) ;
}
二叉树的顺序存储
存储结构及位置结点的结构体
#define MAXSIZE 100
#define MAX_TREE_SIZE 100
typedef int Status;
typedef int CElemType;
typedef CElemType SqBiTree[ MAX_TREE_SIZE] ;
CElemType Nil = 0 ;
typedef struct {
int level;
int order;
} Position;
结点访问函数
Status visit ( CElemType c) {
printf ( "%d " , c) ;
return OK;
}
构造空二叉树
Status InitBiTree ( SqBiTree T) {
for ( int i = 0 ; i < MAX_TREE_SIZE; i++ ) {
T[ i] = Nil;
}
return OK;
}
构造二叉树
Status CreateBiTree ( SqBiTree T) {
int i = 0 ;
while ( i < 10 ) {
T[ i] = i+ 1 ;
printf ( "%d " , T[ i] ) ;
if ( i != 0 && T[ ( i+ 1 ) / 2 - 1 ] == Nil && T[ i] != Nil) {
printf ( "出现无双亲的非根结点%d\n" , T[ i] ) ;
exit ( ERROR) ;
}
i++ ;
}
while ( i < MAX_TREE_SIZE) {
T[ i] = Nil;
i++ ;
}
return OK;
}
二叉树深度
int BiTreeDepth ( SqBiTree T) {
int j = - 1 ;
int i;
for ( i = MAX_TREE_SIZE- 1 ; i>= 0 ; i-- ) {
if ( T[ i] != Nil)
break ;
}
do {
j++ ;
} while ( powl ( 2 , j) <= i) ;
return j;
}
访问结点
CElemType Value ( SqBiTree T, Position e) {
printf ( "%d\n" , ( int ) pow ( 2 , e. level- 1 ) ) ;
printf ( "%d\n" , e. order) ;
return T[ ( int ) pow ( 2 , e. level- 1 ) + e. order- 2 ] ;
}
赋值
Status Assign ( SqBiTree T, Position e, CElemType value) {
int i = ( int ) powl ( 2 , e. level- 1 ) + e. order - 2 ;
if ( value != Nil && T[ ( i+ 1 ) / 2 - 1 ] == Nil) {
return ERROR;
}
if ( value == Nil && ( T[ i* 2 + 1 ] != Nil || T[ i* 2 + 2 ] != Nil) ) {
return ERROR;
}
T[ i] = value;
return OK;
}
层序遍历二叉树
void LevelOrderTraverse ( SqBiTree T) {
int i = MAX_TREE_SIZE- 1 ;
while ( T[ i] == Nil) i-- ;
for ( int j = 0 ; j <= i; j++ )
if ( T[ j] != Nil)
visit ( T[ j] ) ;
printf ( "\n" ) ;
}
前序遍历二叉树
void PreTraverse ( SqBiTree T, int e) {
visit ( T[ e] ) ;
if ( T[ 2 * e + 1 ] != Nil) {
PreTraverse ( T, 2 * e+ 1 ) ;
}
if ( T[ 2 * e + 2 ] != Nil) {
PreTraverse ( T, 2 * e+ 2 ) ;
}
}
Status PreOrderTraverse ( SqBiTree T) {
if ( ! BiTreeEmpty ( T) ) {
PreTraverse ( T, 0 ) ;
}
printf ( "\n" ) ;
return OK;
}
中序遍历
void InTraverse ( SqBiTree T, int e) {
if ( T[ 2 * e+ 1 ] != Nil)
InTraverse ( T, 2 * e+ 1 ) ;
visit ( T[ e] ) ;
if ( T[ 2 * e+ 2 ] != Nil)
InTraverse ( T, 2 * e+ 2 ) ;
}
Status InOrderTraverse ( SqBiTree T) {
if ( ! BiTreeEmpty ( T) ) {
InTraverse ( T, 0 ) ;
}
printf ( "\n" ) ;
return OK;
}
后序遍历
void PostTraverse ( SqBiTree T, int e)
{
if ( T[ 2 * e+ 1 ] != Nil)
PostTraverse ( T, 2 * e+ 1 ) ;
if ( T[ 2 * e+ 2 ] != Nil)
PostTraverse ( T, 2 * e+ 2 ) ;
visit ( T[ e] ) ;
}
Status PostOrderTraverse ( SqBiTree T)
{
if ( ! BiTreeEmpty ( T) )
PostTraverse ( T, 0 ) ;
printf ( "\n" ) ;
return OK;
}