树的创建
typedef struct Node
{
int data;
struct Node *leftchild;
struct Node *rightchild;
}*Bitree,BitNode;
void Create(Bitree &T)
{
int d;
printf("输入结点(按0为空结点):");
scanf("%d",&d);
if(d!=0)
{
T = (Bitree)malloc(sizeof(BitNode));
T->data=d;
Create(T->leftchild);
Create(T->rightchild);
}
else{
T=NULL;
return;
}
}
遍历树(递归)
void PreOrder(Bitree &T)
{
Bitree D;
D=T;
if (D)
{
printf("%d", D->data);
PreOrder(D->leftchild);
PreOrder(D->rightchild);
}
}
void InOrder(Bitree &T)
{
Bitree D;
D=T;
if (T)
{
InOrder(D->leftchild);
printf("%d", D->data);
InOrder(D->rightchild);
}
}
void PostOrder(Bitree &T)
{
Bitree D;
D=T;
if (T)
{
PostOrder(D->leftchild);
PostOrder(D->rightchild);
printf("%d", D->data);
}
}
非递归遍历
#define MaxSize 100
typedef struct{
BitNode *data[MaxSize];
int top;
}SqStack;
void InitStack(SqStack &S){
S.top = -1;
}
bool StackEmpty(SqStack S){
if(S.top==-1) return true;
else return false;
}
void Push(SqStack &S, BitNode *x){
if(S.top==MaxSize-1) return;
S.top = S.top+1;
S.data[S.top]=x;
}
BitNode* Pop(SqStack &S){
if(S.top==-1) return NULL;
BitNode *x;
x= S.data[S.top];
S.top = S.top-1;
return x;
}
void InOrder2(Bitree &T){
SqStack S;
InitStack(S);
Bitree P=T;
while(P||!StackEmpty(S)){
if(P){
Push(S,P);
P=P->leftchild;
}
else{
P=Pop(S);
printf("%d",P->data);
P=P->rightchild;
}
}
}
void PreOrder2(Bitree &T){
SqStack S;
InitStack(S);
Bitree P=T;
while(P||!StackEmpty(S)){
if(P){
printf("%d",P->data);
Push(S,P);
P=P->leftchild;
}
else{
P=Pop(S);
P=P->rightchild;
}
}
}
层次遍历
#define MaxSize 100
typedef struct{
int front,rear;
BitNode *data[MaxSize];
}SqQueue;
void InitQueue(SqQueue &Q){
Q.front=Q.rear=0;
}
bool QueueEmpty(SqQueue Q){
if(Q.front==Q.rear) return true;
else return false;
}
bool EnQueue(SqQueue &Q,BitNode *x){
if((Q.rear+1)%MaxSize==Q.front){
return false;
}
Q.data[Q.rear]=x;
Q.rear = (Q.rear+1)%MaxSize;
return true;
}
BitNode* DeQueue(SqQueue &Q){
if(Q.front==Q.rear) return NULL;
BitNode *x;
x = Q.data[Q.front];
Q.front=(Q.front+1)%MaxSize;
return x;
}
void LevelOrder(Bitree &T){
SqQueue Q;
InitQueue(Q);
Bitree P;
EnQueue(Q,T);
while(!QueueEmpty(Q)){
P=DeQueue(Q);
printf("%d ",P->data);
if(P->leftchild!=NULL)
EnQueue(Q,P->leftchild);
if(P->rightchild!=NULL)
EnQueue(Q,P->rightchild);
}
}
主函数
int main(){
Bitree T;
Create(T);
printf("前序遍历:");
PreOrder(T);
printf("\n");
printf("中序遍历:");
InOrder(T);
printf("\n");
printf("后序遍历:");
PostOrder(T);
printf("\n");
printf("中序遍历(非):");
InOrder2(T);
printf("\n");
printf("前序遍历(非):");
PreOrder2(T);
printf("\n");
printf("层次遍历:");
LevelOrder(T);
return 0;
}
