数据结构学的递归了,深入了解后写一个三序非递归的版本。
//测试数据:abd##eg##h##c#f## #include <cstdio> #include <iostream> typedef char ElemType; typedef struct Node { ElemType elem; struct Node *lchild,*rchild; }Node,*BiTree; typedef struct{ BiTree *base; BiTree *top; int stacksize; }SqStack; void InitStack(SqStack &S) { S.base=(BiTree *)malloc(100*sizeof(BiTree)); if(!S.base) exit(0); S.top=S.base; S.stacksize=100; } void GetTop(SqStack S,BiTree &e) { if(S.top==S.base)exit(0); e=*(S.top-1); } void Pop(SqStack &S,BiTree &e) { if(S.top==S.base)exit(0); e=*--S.top; //先自减,再取值 } void Push(SqStack &S,BiTree e)//严谨的话还应该有if(S.top-S.base>=S.stacksize)的判断,此处略去 { *S.top++=e;//先赋值,再自加 } int Empty(SqStack S) { if(S.top==S.base)return 1; else return 0; } BiTree CreateTree(BiTree &T) { char ch; ch=getchar(); if(ch==‘#‘)T=NULL; else { T=(BiTree)malloc (sizeof(Node)); T->elem=ch; T->lchild=(CreateTree(T->lchild)); T->rchild=(CreateTree(T->rchild)); } return T; } void Middleordertraverse(BiTree T) //中序非递归遍历 { SqStack S; InitStack(S); BiTree p=T; while(p || !Empty(S)) { if(p) { Push(S,p); p=p->lchild; } else { Pop(S,p); printf("%c \n",p->elem); p=p->rchild; } } } void Firstordertraverse(BiTree T)//先序非递归遍历 { SqStack S; InitStack(S); BiTree p=T; while(p || !Empty(S)) { while(p) { Push(S,p); printf("%c \n",p->elem); p=p->lchild; } if(!Empty(S)) { Pop(S,p); p=p->rchild; } } } void BehindorderTraverse(BiTree T) //后序非递归遍历 { SqStack S; InitStack(S); BiTree pre;//设置标志位,标记是否访问过 BiTree p=T; while(p || !Empty(S)) { while(p) //左孩子向下压栈 直到最左下 { Push(S,p); p=p->lchild; } GetTop(S,p); //取当前栈顶 即当前节点最左下 if(!p->rchild || p->rchild==pre)//没右孩子或右孩子被遍历过 { printf("%c \n",p->elem); pre=p; //标记此节点已经走过 Pop(S,p); if( Empty(S))return ; //p回到其父节点(前面肯定了没左子树,而进入此循环显然没右孩子) p=NULL; //不对p左子树遍历 } else p=p->rchild; } return ; } int main() { //freopen("in.txt","r",stdin); printf("请给出二叉树的节点序列: \n"); BiTree T; CreateTree(T); printf(" 中序遍历二叉树结果是 : \n"); Middleordertraverse(T); printf(" 先序遍历二叉树结果是 : \n"); Firstordertraverse(T); printf(" 后序遍历二叉树结果是 : \n"); BehindorderTraverse(T); return 0; }
时间: 2024-10-12 22:10:23