main.cpp
# include "function.h"
void PreOrder ( BiTree p) { if ( p != NULL ) { printf ( "%c " , p-> c) ; PreOrder ( p-> lchild) ; PreOrder ( p-> rchild) ; }
}
void InOrder ( BiTree p) { if ( p != NULL ) { InOrder ( p-> lchild) ; printf ( "%c " , p-> c) ; InOrder ( p-> rchild) ; }
}
void PostOrder ( BiTree p) { if ( p != NULL ) { PostOrder ( p-> lchild) ; PostOrder ( p-> rchild) ; printf ( "%c " , p-> c) ; }
}
void LevelOrder ( BiTree T) { LinkQueue Q; InitQueue ( Q) ; BiTree p; EnQueue ( Q, T) ; while ( ! IsEmpty ( Q) ) { DeQueue ( Q, p) ; putchar ( p-> c) ; if ( p-> lchild) { EnQueue ( Q, p-> lchild) ; } if ( p-> rchild) { EnQueue ( Q, p-> rchild) ; } }
} int main ( ) { BiTree pnew; BiTree tree = NULL ; ptag_t phead = NULL , ptail = NULL , listpnew = NULL , pcur = NULL ; char c; int i = 0 ; while ( scanf ( "%c" , & c) ) { if ( c == '\n' ) { break ; } pnew = ( BiTree) calloc ( 1 , sizeof ( BiNode) ) ; pnew-> c = c; listpnew = ( ptag_t) calloc ( 1 , sizeof ( tag_t) ) ; listpnew-> p = pnew; if ( tree == NULL ) { tree = pnew; phead = listpnew; ptail = listpnew; pcur = listpnew; } else { ptail-> pnext = listpnew; ptail = ptail-> pnext; if ( pcur-> p-> lchild == NULL ) { pcur-> p-> lchild = pnew; } else if ( pcur-> p-> rchild == NULL ) { pcur-> p-> rchild = pnew; pcur = pcur-> pnext; } } } printf ( "------------PreOrder------------------\n" ) ; PreOrder ( tree) ; printf ( "\n------------InOrder------------------\n" ) ; InOrder ( tree) ; printf ( "\n------------PostOrder------------------\n" ) ; PostOrder ( tree) ; printf ( "\n------------LevelOrder------------------\n" ) ; LevelOrder ( tree) ; return 0 ;
}
queue.cpp
# include "function.h" void InitQueue ( LinkQueue & Q) { Q. front = Q. rear = ( LinkNode * ) malloc ( sizeof ( LinkNode) ) ; Q. front-> next = NULL ;
} bool IsEmpty ( LinkQueue Q) { return Q. front== Q. rear;
} void EnQueue ( LinkQueue & Q, ElemType x) { LinkNode * pnew = ( LinkNode * ) malloc ( sizeof ( LinkNode) ) ; pnew-> data = x; pnew-> next = NULL ; Q. rear-> next = pnew; Q. rear = Q. rear-> next;
}
bool DeQueue ( LinkQueue & Q, ElemType & x) { if ( Q. rear == Q. front) return false ; LinkNode * q = Q. front-> next; Q. front-> next = q-> next; x = q-> data; if ( Q. rear == q) { Q. rear = Q. front; } free ( q) ; return true ;
}
function.h
# ifndef UNTITLED_FUNCTION_H
# define UNTITLED_FUNCTION_H # endif # include <stdio.h>
# include <stdlib.h> typedef char BiElemType;
typedef struct BiNode { BiElemType c; struct BiNode * lchild; struct BiNode * rchild;
} BiNode, * BiTree;
typedef struct tag { BiTree p; struct tag * pnext;
} tag_t, * ptag_t;
typedef BiTree ElemType;
typedef struct LinkNode { ElemType data; struct LinkNode * next;
} LinkNode; typedef struct { LinkNode * front, * rear;
} LinkQueue; void InitQueue ( LinkQueue & Q) ;
bool IsEmpty ( LinkQueue Q) ;
void EnQueue ( LinkQueue & Q, ElemType x) ;
bool DeQueue ( LinkQueue & Q, ElemType & x) ;