#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)); }
/* http://black4yl.blog.51cto.com */
ide