#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)