#include<iostream> #include<stdio.h> #include<malloc.h> using namespace std; #define MaxSize 100 typedef char ElemType; typedef struct node { ElemType data;//數據類型 struct node *lchild;//指向左孩子 struct node *rchild;//指向右孩子 }BTNode; void CreateBTNode(BTNode *&b,char *str)//由str串創建二叉鏈 { BTNode *St[MaxSize],*p=NULL; int top=-1,k,j=0; char ch; b=NULL;//建立二叉鏈初始時為空 ch=str[j]; while(ch!='\0')//str未掃描完時循環 { switch(ch) { case'(':top++;St[top]=p;k=1;break;//為左結點 case')':top--;break; case',':k=2;break;//為右結點 default:p=(BTNode *)malloc(sizeof(BTNode)); p->data=ch; p->lchild=p->rchild=NULL; if(b==NULL)//p指向二叉樹的根結點 b=p; else//已建立二叉樹根結點 { switch(k) { case 1:St[top]->lchild=p;break; case 2:St[top]->rchild=p;break; } } } j++; ch=str[j]; } } void DispBTNode(BTNode *b)//以括號表示法輸出二叉樹 { if(b!=NULL) { printf(" %c",b->data); if(b->lchild!=NULL||b->rchild!=NULL) { printf("("); DispBTNode(b->lchild); if(b->rchild!=NULL) printf(","); DispBTNode(b->rchild); printf(")"); } } } void PerOrder(BTNode *b)//先序遍歷的遞歸算法 { if(b!=NULL) { printf(" %c ",b->data);//訪問根結點 PerOrder(b->lchild);//遞歸訪問左子樹 PerOrder(b->rchild);//遞歸訪問右子樹 } } void PerOrder1(BTNode *b)//先序遍歷的非遞歸算法 { BTNode *St[MaxSize],*p; int top=-1; if(b!=NULL) { top++;//根結點入棧 St[top]=b; while(top>-1)//桟不為空時循環 { p=St[top];//退桟並訪問該結點 top--; printf(" %c ",p->data); if(p->rchild!=NULL)//右孩子入桟 { top++; St[top]=p->rchild; } if(p->lchild!=NULL)//左孩子入桟 { top++; St[top]=p->lchild; } } printf("\n"); } } void InOrder(BTNode *b)//中序遍歷的遞歸算法 { if(b!=NULL) { InOrder(b->lchild);//遞歸訪問左子樹 printf(" %c ",b->data);//訪問根結點 InOrder(b->rchild);//遞歸訪問右子樹 } } void InOrder1(BTNode *b)//中序遍歷的非遞歸算法 { BTNode *St[MaxSize],*p; int top=-1; if(b!=NULL) { p=b; while(top>-1||p!=NULL) { while(p!=NULL) { top++; St[top]=p; p=p->lchild; } if(top>-1) { p=St[top]; top--; printf(" %c ",p->data); p=p->rchild; } } printf("\n"); } } void PostOrder(BTNode *b)//后序遍歷的遞歸算法 { if(b!=NULL) { PostOrder(b->lchild);//遞歸訪問左子樹 PostOrder(b->rchild);//遞歸訪問右子樹 printf(" %c ",b->data);//訪問根結點 } } void PostOrder1(BTNode *b)//后序遍歷的非遞歸算法 { BTNode *St[MaxSize],*p; int flag,top=-1;//桟指針初值 if(b!=NULL) { do { while(b!=NULL)//將b的所有左結點入桟 { top++; St[top]=b; b=b->lchild; } p=NULL;//p指向當前結點的前一個訪問的結點 flag=1;//設置b的訪問標記為已訪問過 while(top!=-1&&flag) { b=St[top];//取出當前的桟頂元素 if(b->rchild==p)//右子樹不存在或已被訪問,訪問之 { printf(" %c ",b->data);//訪問*b結點 top--; p=b;//p指向剛被訪問的結點 } else { b=b->rchild;//指向右子樹 flag=0;//設置未被訪問的標記 } } }while(top!=-1); printf("\n"); } } void TravLevel(BTNode *b)//層次遍歷 { BTNode *Qu[MaxSize];//定義順序循環隊列 int front,rear;//定義隊首和隊尾指針 front=rear=0;//置隊列為空隊列 if(b!=NULL) printf(" %c ",b->data); rear++;//結點指針進入隊列 Qu[rear]=b; while(rear!=front)//隊列不為空 { front=(front+1)%MaxSize; b=Qu[front]; if(b->lchild!=NULL)//隊頭出隊列 { printf(" %c ",b->lchild->data);//輸出左孩子,並入隊列 rear=(rear+1)%MaxSize; Qu[rear]=b->lchild; } if(b->rchild!=NULL)//輸出右孩子,並入隊列 { printf(" %c ",b->rchild->data); rear=(rear+1)%MaxSize; Qu[rear]=b->rchild; } } printf("\n"); } void main() { BTNode *b; CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))"); printf(" 二叉樹 b:");DispBTNode(b);printf("\n\n"); printf(" 層次遍歷序列:"); TravLevel(b); printf("\n"); printf(" 先序遍歷序列:\n"); printf(" 遞歸算法:");PerOrder(b);printf("\n"); printf(" 非遞歸算法:");PerOrder1(b);printf("\n"); printf(" 中序遍歷序列:\n"); printf(" 遞歸算法:");InOrder(b);printf("\n"); printf(" 非遞歸算法:");InOrder1(b);printf("\n"); printf(" 后序遍歷序列:\n"); printf(" 遞歸算法:");PostOrder(b);printf("\n"); printf(" 非遞歸算法:");PostOrder1(b);printf("\n"); }