#include<iostream> #include<stdlib.h> #include<stdio.h> using namespace std; #define OK 1 #define ERROR 0 #define OVERFLOW 0 #define TRUE 1 #define FALSE 0 typedef char TElemType; typedef struct BiTNode { TElemType data; struct BiTNode *lchild,*rchild; } BiTNode,*BiTree; typedef BiTree sElemType; typedef int Status; typedef struct StackNode { sElemType data; struct StackNode *next; } StackNode,*LinkStackPtr; typedef struct LinkStack { LinkStackPtr top; int sum; } LinkStack; //栈空 Status StackEmpty(LinkStack *S) { if(S->sum == 0) { return TRUE; } else { return FALSE; } } //入栈 Status Push(LinkStack *S,sElemType e) { LinkStackPtr ls = (LinkStackPtr)malloc(sizeof(StackNode)); ls->data = e; ls->next = S->top; S->top = ls; S->sum++; return OK; } //出栈 Status Pop(LinkStack *S,sElemType &e) { if(StackEmpty(S)) { cout<<"栈空"<<endl; return ERROR; } LinkStackPtr p = S->top; S->top = p->next; e = p->data; free(p); S->sum--; return OK; } //获取栈顶元素 Status GetTop(LinkStack *S,sElemType &e) { if(StackEmpty(S)) { cout<<"栈空"<<endl; return ERROR; } LinkStackPtr p = S->top; e = p->data; free(p); return OK; } Status init_BiTree(BiTree &T) { T = (BiTree)malloc(sizeof(BiTNode)); if(!T) { exit(OVERFLOW); } return OK; } Status CreateBiTree(BiTree &T) { BiTree b = (BiTree)malloc(sizeof(BiTNode)); char ch = cin.get(); if(ch == ' ') { cout<<"NUll"<<endl; T = NULL; } else { cout<<"再次输入-------------"<<endl; if(!(T=(BiTree)malloc(sizeof(BiTNode)))) { exit(OVERFLOW); } T ->data = ch; CreateBiTree(T->lchild); CreateBiTree(T->rchild); } return OK; } //中序遍历 循环:(向左走到尽头,弹出空结点后,取栈顶元素数据,而后将其右孩子压入栈) Status InOrderTraverse (BiTree T,Status (*Visit)(TElemType e)) { LinkStack *S ; S=(LinkStack*)malloc(sizeof(LinkStack)); S->sum=0; Push(S,T); BiTree p; while(!StackEmpty(S)) { while(GetTop(S,p)&&p) { Push(S,p->lchild);//向左走到尽头 } Pop(S,p); if(!StackEmpty(S)) { Pop(S,p); if(!Visit(p->data)) { return ERROR; } Push(S,p->rchild); } } return OK; } //前序遍历 Status PreOrderTraverse (BiTree T,Status (*Visit)(TElemType e)) { LinkStack *S ; //InitStack(S); S=(LinkStack*)malloc(sizeof(LinkStack)); S->sum=0; Push(S,T); BiTree p; while(!StackEmpty(S)) { while(GetTop(S,p)&&p) { if(!Visit(p->data)) { return ERROR; } Push(S,p->lchild);//向左走到尽头 } Pop(S,p);//弹出空结点 if(!StackEmpty(S)) { Pop(S,p);//弹出左兄弟结点 Pop(S,p);//弹出双亲 Push(S,p->rchild);//右兄弟结点压入栈中 } } return OK; } //后续遍历 Status PostOrderTraverse(BiTree T,Status(*Visit)(TElemType e)) { LinkStack *S; S = (LinkStack*)malloc(sizeof(LinkStack)); S->sum = 0; BiTree p;//当前结点 BiTree pLastVisit;//记录上次访问的结点 Push(S,T); while(GetTop(S,p)&&p) { Push(S,p->lchild);//向左走到尽头 } Pop(S,p);//弹出空结点 while(!StackEmpty(S)) { Pop(S,p); if(p) { //若是没有右子树或右子树已经访问过(输出结点包含的数值),再访问该结点数 if(p->rchild == NULL||p->rchild==pLastVisit) { if(!Visit(p->data)) { return ERROR; } pLastVisit = p; } //若是有右子树且没有访问过,右结点入栈,同时向左走到尽头 else { Push(S,p); p = p->rchild; while(p) { Push(S,p); p = p->lchild; } } } } } Status Visit(TElemType e) { if(e ==NULL) { return ERROR; } cout<<e<<"--"; return OK; } int main() { BiTree T; CreateBiTree(T); cout<<"输入完毕"<<endl; PostOrderTraverse(T,Visit); }