二叉樹的前中後以及層次遍歷

#include "stdio.h"
#include "malloc.h"
#define datatype char 
typedef struct bT
{
datatypedata;
struct bT *lt,*rt;
}* bitree,BiNode;
void preExCreate(bitree bt);
/*遞歸實現*/
void FprePost(bitree bt)
{
if(bt)
{
printf("%c",bt->data);
FprePost(bt->lt);
FprePost(bt->rt);
}
}
void FinPost(bitree bt)
{
if(bt)
{
FinPost(bt->lt);
printf("%c",bt->data);
FinPost(bt->rt);
}
}
void FlaPost(bitree bt)
{
if(bt)
{
FlaPost(bt->lt);
FlaPost(bt->rt);
printf("%c",bt->data);
}
}
/*
非遞歸實現
*/
void prePost(bitree  bt)
{
BiNode* stack[100];
int top=0;
BiNode* p = bt;
int q=0;
while(top>0 || p != NULL)
{
while(p!=NULL)
{
if(p->lt ==NULL && p->rt==NULL)\
q++;
printf("%c",p->data);

stack[top++] = p;
p = p->lt;
} //左子樹所有入棧
p = stack[--top];
p = p->rt;
}
}
void inPost(bitree  bt)
{
BiNode* stack[100];
int top=0;
BiNode* p = bt;
int q = 0;
while(top>0 || p != NULL)
{
while(p!=NULL)
{
stack[top++] = p;
p = p->lt;
} //左子樹所有入棧
p = stack[--top];
printf("%c",p->data);
p = p->rt;
}
}
void  laPost(bitree bt)
{
BiNode* stack[100];
BiNode* Visted= NULL;
int top=0;
BiNode* p = bt;
while(top>0 || p != NULL)
{
while(p!=NULL)//  while 不是if
{
stack[top++] = p;
p = p->lt;
} //左子樹所有入棧
p = stack[top-1];//取棧頂
if(p->rt == Visted  || p->rt == NULL)//右子樹不空或是被訪問過
{
printf("%c",p->data);
Visted = p;//標記p被訪問
--top;//棧頂出
p = NULL;//繼續 右
}
else
{
 p = p->rt;
}
}
}
void Excreate (bitree* bt)
{
char c = getchar();
if( c == '.')  (*bt) = NULL;
else
{
(*bt) = (bitree)malloc(sizeof(BiNode));
(*bt)->data = c;
Excreate(&(*bt)->lt);
Excreate(&(*bt)->rt);
}
}
void PrintTree(bitree bt,int nLayer)  /* 按豎向樹狀打印的二叉樹*/
{
if(bt == NULL) return;
PrintTree(bt->rt,nLayer+1);
for(int i=0;i<nLayer;i++)
printf("  ");
printf("%c\n",bt->data);
PrintTree(bt->lt,nLayer+1);
}
int DepthOfTree(bitree bt)
{
int Ld,Rd,max;
if(bt != NULL)
{
Ld = DepthOfTree( bt->lt );
Rd = DepthOfTree( bt->rt );
max = Ld>Rd? Ld:Rd;
return max+1;
}
else
return 0;
}
void CCPost(bitree bt)//層次遍歷
{
bitree que[100];
int front=-1,rear=0;
que[rear] = bt;
while( front != rear)
{
front++;//出隊
printf("%c",que[front]->data);
if(que[front]->lt != NULL)
{
rear++;
que[rear] = que[front]->lt ; //入隊
}
if(que[front]->rt != NULL)
{
rear++;
que[rear] = que[front]->rt;
}
}
}
void main()
{
bitree bt,pre;
Excreate(&bt);
pre = bt;
//前序遍歷
printf("前序遍歷:\n");
FprePost(bt);
//中序
printf("\n中序遍歷:\n");
FinPost(bt);
printf("\n後序遍歷:\n");
//後序
FlaPost(bt);
printf("\n層次遍歷:\n");
//層次
CCPost(bt);
//橫向打印二叉樹
printf("\n橫向打印二叉樹:\n");
PrintTree(bt,DepthOfTree(bt));
//計算二叉樹深度
printf("\n二叉樹深度%d\n",DepthOfTree(bt));
}
wKiom1Rt6a_QIv2tAADsFvG93oE180.jpg

/* http://black4yl.blog.51cto.com    */
ide

相關文章
相關標籤/搜索