#define MaxSize 100
struct TreeNode {
ElemType value;
bool isEmpty;
} ;
TreeNode t[ MaxSize] ;
for ( int i = 0 ; i < MaxSize; i++ ) {
t[ i] . isEmpty = true;
}
struct ElemType {
int value;
} ;
typedef struct BiTNode {
ElemType data;
struct BiTNode * lchild, * rchild;
} BiTNode, * BiTree;
BiTree root = NULL ;
root = ( BiTree) malloc ( sizeof ( BiTNode) ) ;
root-> data. = { 1 } ;
root-> lchild = NULL ;
root-> rchild = NULL ;
BiTNode * p = ( BiTNode * ) malloc ( sizeof ( BiTNode) ) ;
p-> data = { 2 } ;
p-> lchild = NULL ;
p-> rchild = NULL ;
root-> lchild = p;
int treeDepth ( BiTree T) {
if ( T == NULL ) {
return 0 ;
}
else {
int l = treeDepth ( T-> lchild) ;
int r = treeDepth ( T-> rchild) ;
return l > r ? l + 1 : r + 1 ;
}
}
void LevelOrder ( BiTree T) {
LinkQueue Q;
InitQueue ( Q) ;
BiTree p;
EnQueue ( Q, T) ;
while ( ! IsEmpty ( Q) ) {
DeQueue ( Q,p) ;
visit ( p) ;
if ( p-> lchild != NULL )
EnQueue ( Q, p-> lchild) ;
if ( p-> rchild != NULL )
EnQueue ( Q, p-> rchild) ;
}
}
typedef struct BiTNode {
char data;
struct BiTNode * lchild, * rchild;
} BiTNode, * BiTree;
typedef struct LinkNode {
BiTNode * data;
struct LinkNode * next;
} LinkNode;
typedef struct {
LinkNode * front, * rear;
} LinkQueue;
struct CTNode {
int child;
struct CTNode * next;
} ;
typedef struct {
ElemType data;
struct CTNode * firstChild;
} CTBox;
typedef struct {
CTBox nodes[ MAX_ TREE_ SIZE] ;
int n, r;
} CTree;
typedef struct ThreadNode {
ElemType data;
struct ThreadNode * lchild, * rchild;
int ltag, rtag;
} ThreadNode, * ThreadTree;
void InThread ( ThreadTree T) {
if ( T != NULL ) {
InThread ( T-> lchild) ;
visit ( T) ;
InThread ( T-> rchild) ;
}
}
void visit ( ThreadNode * q) {
if ( q-> lchild == NULL ) {
q-> lchild = pre;
q-> ltag = 1 ;
}
if ( pre != NULL && pre-> rchild == NULL ) {
pre-> rchild = q;
pre-> rtag = 1 ;
}
pre = q;
}
void CreateInThread ( ThreadTree T) {
pre = NULL ;
if ( T != NULL ) {
InThread ( T) ;
if ( pre-> rchild == NULL )
pre-> rtag = 1 ;
}
}
ThreadNode * pre= NULL ;
void InThread ( ThreadTree p, ThreadTree & pre) {
if ( p != NULL ) {
InThread ( p-> lchild, pre) ;
if ( p-> lchild == NULL ) {
p-> lchild= pre;
p-> ltag = 1 ;
}
if ( pre != NULL && pre-> rchild == NULL ) {
pre-> rchild = p;
pre-> rtag = 1 ;
}
pre = p;
InThread ( p-> rchild, pre) ;
}
}
void CreateInThread ( ThreadTree T) {
ThreadTree pre = NULL ;
if ( T != NULL ) {
InThread ( T, pre) ;
pre-> rchild = NULL ;
pre-> rtag = 1 ;
}
}
void PreThread ( ThreadTree T) {
if ( T != NULL ) {
visit ( T) ;
if ( T-> ltag == 0 )
PreThread ( T-> lchild) ;
PreThread ( T-> rchild) ;
}
}
void visit ( ThreadNode * q) {
if ( q-> lchild == NULL ) {
q-> lchild = pre;
q-> ltag = 1 ;
}
if ( pre != NULL && pre - > rchild == NULL ) {
pre-> rchild = q;
pre-> rtag = 1 ;
}
pre = q;
}
ThreadNode * pre = NULL ;
void PreThread ( ThreadTree p, ThreadTree & pre) {
if ( p != NULL ) {
if ( p-> lchild == NULL ) {
p-> lchild = pre;
p-> ltag = 1 ;
}
if ( pre != NULL && pre-> rchild == NULL ) {
pre-> rchild = p;
pre-> rtag = 1 ; .
pre = p;
if ( p-> ltag == 0 )
InThread ( p-> lchild, pre) ;
InThread ( p-> rchild, pre) ;
}
}
void CreatePreThread ( ThreadTree T) {
ThreadTree pre = NULL ;
if ( T != NULL ) {
PreThread ( T, pre) ;
if ( pre-> rchild == NULL )
pre-> rtag = 1 ;
}
}
ThreadNode * pre = NULL ;
void CreatePostThread ( ThreadTree T) {
pre = NULL ;
if ( T != NULL ) {
InThread ( T) ;
if ( pre-> rchild == NULL )
pre-> rtag = 1 ;
}
}
void PostThread ( ThreadTree T) {
if ( T!= NULL ) {
PostThread ( T-> lchild) ;
PostThread ( T-> rchild) ;
visit ( T) ;
}
}
void visit ( ThreadNode * q) {
if ( q-> lchild == NULL ) {
q-> lchild = pre;
q-> ltag = 1 ;
}
if ( pre != NULL && pre-> rchild == NULL ) {
pre-> rchild = q;
pre-> rtag = 1 ;
}
pre = q;
}
void PostThread ( ThreadTree p, ThreadTree & pre) {
if ( p != NULL ) {
InThread ( p-> lchild, pre) ;
InThread ( p-> rchild, pre) ;
if ( p-> lchild == NULL ) {
p-> lchild = pre;
p-> ltag = 1 ; .
}
if ( pre!= NULL && pre-> rchild == NULL ) {
pre-> rchild = p;
pre-> rtag = 1 ;
}
pre = p;
}
}
void CreatePostThread ( ThreadTree T) {
ThreadTree pre = NULL ;
if ( T != NULL ) {
PostThread ( T, pre) ;
if ( pre-> rchild == NULL )
pre-> rtag = 1 ;
}
}
ThreadNode* FirstNode ( ThreadNode * p)
{
while ( 0 == p-> ltag) {
p = p-> lchild;
}
return p;
}
ThreadNode * NextNode ( ThreadNode * p)
{
if ( 0 == p-> rtag) {
return FirstNode ( p-> rchild) ;
}
else {
return p-> rchild;
}
}
void InOrder ( ThreadNode * T)
{
for ( ThreadNode * p = FirstNode ( T) ; p != NULL ; p = NextNode ( p) ) {
PrintNode ( p) ;
}
}
ThreadNode* LastNode ( ThreadNode * p)
{
while ( 0 == p-> rtag) {
p = p-> rchild;
}
return p;
}
ThreadNode* PreNode ( ThreadNode * p)
{
if ( p-> ltag == 0 ) {
return LastNode ( p-> lchild) ;
}
else {
return p-> lchild;
}
}
void RevInOrder ( ThreadNode * T)
{
for ( ThreadNode * p = LastNode ( T) ; p != NULL ; p = PreNode ( p) ) {
PrintNode ( p) ;
}
}