#include <stdio.h> #include <iostream> #include <algorithm> using namespace std; #define MAXSIZE 100 typedef struct BiTNode { char data; struct BiTNode *l; struct BiTNode *r; } BiTNode,*BiTree; typedef struct /*base為棧底指針,top為棧底指針,插入:top++; 刪除:top--;*/ { BiTree *base; BiTree *top; int stacksize; }SqStack;///棧的定義(順序棧) void InitStack(SqStack &S) ///初始化 { S.base=new BiTree[MAXSIZE]; if(!S.base) printf("存儲分配失敗\n"); S.top=S.base; S.stacksize=MAXSIZE; } int Push(SqStack &S,BiTree e) { if(S.top-S.base==S.stacksize) return 0; *S.top++=e; return 1; } int Pop(SqStack &S,BiTree &e) { if(S.top==S.base) return 0; e=*--S.top; return 1; } int StackEmpty(SqStack &S) { if(S.top==S.base)//棧空 return 1; else return 0; } void PreCreatBiTree(BiTree &T)///先序創建 { ///按先序次序輸入二叉樹中結點的值(一個字符),創建二叉鏈表表示的二叉樹T; char ch; scanf("%c",&ch); if(ch=='#') T=NULL; else { T=new BiTNode; T->data=ch; PreCreatBiTree(T->l); PreCreatBiTree(T->r); } } void MidOrderTraverse(BiTree &T)///中序遍歷的非遞歸算法 { SqStack S; BiTree q,p; InitStack(S);///初始化一個空棧 p=T;///指針p指向根結點 q=new BiTNode;///申請一個結點空間q,用來存放棧頂彈出的元素 while(p||!StackEmpty(S))///(當p非空or棧S非空) { if(p) { Push(S,p); p=p->l; } else { Pop(S,q); printf("%c",q->data); p=q->r; } } } int main() { BiTree T; PreCreatBiTree(T); MidOrderTraverse(T); return 0; }
先序創建二叉樹,非遞歸中序遍歷輸出(利用棧,Push,Pop,StackEmpty)