6_38_二叉树的后序遍历非递归算法(和先序有些许不一样)
#include<stdio.h> #include<stdlib.h> #include<malloc.h> typedef struct node { int data,tag; struct node*lchild,*rchild; }tnode,*tree; tree creat() { int x; tree t; scanf("%d",&x); if(x==0)t=NULL; else { t=(tnode*)malloc(sizeof(tnode)); t->data=x; t->lchild=creat(); t->rchild=creat(); } return t; } void postorder(tree t) { tree stack[200]; int top=0; while(top||t) { if(t) { t->tag=0;//标记未访问结束 stack[top++]=t;//入栈保存 t=t->lchild;//进入左子树 } else if(!stack[top-1]->tag)//如果没有访问栈顶的右子树 { t=stack[top-1];//获得栈顶的节点 t->tag=1;//标记栈顶的节点访问了右节点 t=t->rchild;//进入栈顶的右节点 } else { t=stack[--top];//栈顶元素出栈 printf("%d\n",t->data);//访问完子节点,访问本节点 t=NULL;//该节点结束 } } } void Postorder(tree t) { tree Stack[200]; int TagStack[200],top=0; while(t||top) { if(t) { Stack[top]=t; TagStack[top++]=0; t=t->lchild; } else if(!TagStack[top-1]) { t=Stack[top-1]; TagStack[top-1]=1; t=t->rchild; } else { t=Stack[--top]; printf("%d\n",t->data); t=NULL; } } } int main() { tree t=creat(); Postorder(t); }
版权声明:本文为博主原创文章,未经博主允许不得转载。