完全二叉树的构建及链式存储
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define max 51
#define initSize 10
typedef struct
{
int number[ initSize] ;
int top;
} Stack;
struct People
{
char name[ max] ;
char ID[ max] ;
} ;
typedef struct treeNode
{
People people1;
struct treeNode* lNext;
struct treeNode* rNext;
} treeNode , * BiTree;
void initStack ( Stack& stack) ;
bool stackEmpty ( Stack stack) ;
bool stackFull ( Stack stack) ;
bool push ( Stack& stack, int number) ;
bool pop ( Stack& stack, int & number) ;
void initTree ( BiTree & tree , People peo) ;
void preOrder ( BiTree tree , int & i) ;
void inOrder ( BiTree tree , int & i) ;
void postOrder ( BiTree tree, int & i) ;
void visit ( BiTree tree , int & i ) ;
void getStack ( Stack& stack, int i) ;
bool addNode ( BiTree & tree , People peo) ;
bool delBiTree ( BiTree & tree) ;
void printPeo ( People peo) ;
int main ( )
{
People peo = { "李参政" , "0418" } ;
People peo1[ 6 ] = { { "李" , "0418" } , { "参" , "0418" } , { "正" , "0418" } , { "li" , "0418" } , { "can" , "0418" } , { "zheng" , "0418" } } ;
BiTree tree;
initTree ( tree , peo) ;
for ( int j = 0 ; j < 6 ; j++ )
{
addNode ( tree, peo1[ j] ) ;
}
int i = 0 ;
printf ( "i = %d\n" , i) ;
printf ( "先序遍历\n" ) ;
preOrder ( tree, i) ;
printf ( "********************************************\n" ) ;
i = 0 ;
printf ( "i = %d\n" , i) ;
printf ( "中序遍历\n" ) ;
inOrder ( tree, i) ;
printf ( "********************************************\n" ) ;
i = 0 ;
printf ( "i = %d\n" , i) ;
printf ( "后序遍历\n" ) ;
postOrder ( tree, i) ;
printf ( "********************************************\n" ) ;
delBiTree ( tree) ;
return 0 ;
}
void initTree ( BiTree& tree , People peo)
{
tree = ( treeNode* ) malloc ( sizeof ( treeNode) ) ;
tree-> people1 = peo;
tree-> lNext = NULL ;
tree-> rNext = NULL ;
}
void preOrder ( BiTree tree, int & i)
{
if ( tree != NULL )
{
visit ( tree, i) ;
preOrder ( tree-> lNext, i) ;
preOrder ( tree-> rNext , i) ;
}
}
void inOrder ( BiTree tree, int & i)
{
if ( tree != NULL )
{
preOrder ( tree-> lNext, i) ;
visit ( tree, i) ;
preOrder ( tree-> rNext, i) ;
}
}
void postOrder ( BiTree tree, int & i)
{
if ( tree != NULL )
{
preOrder ( tree-> lNext, i) ;
preOrder ( tree-> rNext, i) ;
visit ( tree, i) ;
}
}
void visit ( BiTree tree, int & i)
{
if ( tree != NULL )
{
i++ ;
printPeo ( tree-> people1) ;
}
else
;
}
bool addNode ( BiTree& tree, People peo )
{
int num = 0 ;
preOrder ( tree , num) ;
treeNode* node = NULL ;
node = tree;
num++ ;
int last_number = num - ( ( int ) ( num / 2 ) ) * 2 ;
Stack stack;
initStack ( stack) ;
int stack_number = num / 2 ;
getStack ( stack, stack_number) ;
while ( ! stackEmpty ( stack) )
{
int number = 0 ;
pop ( stack, number) ;
if ( node != NULL && number == 0 && node-> lNext != NULL )
node = node-> lNext;
if ( node != NULL && number == 1 && node-> rNext != NULL )
node = node-> rNext;
}
treeNode* newnode = ( treeNode* ) malloc ( sizeof ( treeNode) ) ;
newnode-> people1 = peo;
newnode-> lNext = NULL ;
newnode-> rNext = NULL ;
if ( last_number == 0 )
{
node-> lNext = newnode;
}
if ( last_number == 1 )
{
node-> rNext = newnode;
}
return true;
}
bool delBiTree ( BiTree& tree)
{
if ( tree == NULL )
return false;
if ( tree-> lNext == NULL && tree-> rNext == NULL )
{
free ( tree) ;
return true;
}
int num = 0 ;
preOrder ( tree, num) ;
while ( num != 0 )
{
treeNode* node = NULL ;
node = tree;
int last_nuber = num - ( int ) ( num / 2 ) * 2 ;
Stack stack;
initStack ( stack) ;
getStack ( stack, num/ 2 ) ;
while ( ! stackEmpty ( stack) )
{
int number = 0 ;
pop ( stack, number) ;
if ( node != NULL && number == 0 && node-> lNext != NULL )
node = node-> lNext;
else if ( node != NULL && number == 1 && node-> rNext != NULL )
node = node-> rNext;
}
if ( last_nuber == 0 )
{
free ( node-> lNext) ;
node-> lNext = NULL ;
}
else if ( last_nuber == 1 )
{
free ( node-> rNext) ;
node-> rNext = NULL ;
}
num-- ;
}
return true;
}
void getStack ( Stack & stack , int i)
{
int num = i;
int quo = 0 ;
while ( num/ 2 != 0 )
{
quo = num / 2 ;
int ele = num - quo * 2 ;
push ( stack, ele) ;
num = num / 2 ;
}
}
void printPeo ( People peo)
{
printf ( "name = %s\n" , peo. name) ;
printf ( "ID = %s\n" , peo. ID) ;
printf ( "-------------------------------\n" ) ;
}
void initStack ( Stack& stack)
{
stack. top = 0 ;
}
bool stackEmpty ( Stack stack)
{
if ( stack. top == 0 )
return true;
else
return false;
}
bool stackFull ( Stack stack)
{
if ( stack. top >= initSize)
return true;
else
return false;
}
bool push ( Stack& stack, int number)
{
if ( stackFull ( stack) )
return false;
int top = stack. top;
stack. number[ top] = number;
++ stack. top;
return true;
}
bool pop ( Stack& stack, int & number)
{
if ( stackEmpty ( stack) )
return false;
else
{
-- stack. top;
int top = stack. top;
number = stack. number[ top] ;
}
return true;
}
int getPop ( Stack& stack)
{
if ( ! stackEmpty ( stack) )
{
int i = stack. top - 1 ;
return stack. number[ i] ;
}
}