**完整程序,C语言,辅助为记录就近访问过节点的非递归后序遍历算法!**
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 100
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
typedef struct Stack{
BiTNode* data[MaxSize];//记录地址
int top;
}Stack;
//1.按先序次序生成二叉树
void Build_Tree(BiTree &T);
//4.后序遍历-非递归
void PostOrder(BiTree T) ;
void Initstack( Stack &s);//初始化栈
void push(Stack &s,BiTNode *x );
void ptfirst(BiTree T);
void pop(Stack &s,BiTNode* &x);
void gettop( Stack s,BiTNode* &x);
bool isEmpty(Stack s);//判断空栈
int main(){
BiTree T;
printf("清输入字母:");
Build_Tree(T);
printf("前序:");
ptfirst(T);
printf("\n");
printf("后序非递归:");
PostOrder(T);
return 0;
}
void ptfirst(BiTree T){
if(T!= NULL) {printf("%c\t",T->data);
ptfirst(T-> lchild);
ptfirst(T-> rchild);}
}
//1.按先序次序生成二叉树
void Build_Tree(BiTree &T)
{
char ch;
scanf("%c",&ch);
if(ch=='#')
{
T=NULL;
}
else
{
T=(BiTree)malloc(sizeof(BiTNode));
T->data=ch;
Build_Tree(T->lchild);
Build_Tree(T->rchild);
}
}
//4.后序遍历-非递归
void PostOrder(BiTree T) {
Stack s;
Initstack(s);
BiTNode* p=T;
BiTNode* r= NULL;
while(p||!isEmpty(s)){
if(p){
push(s,p);
p=p-> lchild;
} else{
gettop(s,p);
if(p-> rchild && p-> rchild!=r){
p=p-> rchild;
push(s,p);
p=p-> lchild;
} else{
pop(s,p);
printf("%c\t",p->data);
r=p;
p= NULL;
}
}
}
}
void Initstack( Stack &s)//初始化栈
{
s.top =-1;
}
void push(Stack &s,BiTNode *x )//入栈操作
{
if(s.top== MaxSize-1) printf("栈满");
else{
s.data[++s.top] = x;
}
}
void pop(Stack &s,BiTNode* &x)//取栈顶并出栈顶
{
if(s.top== -1) printf("栈空");
else{
x=s.data[s.top--];
}
}
void gettop( Stack s,BiTNode* &x){
x=s.data[s.top];
}
bool isEmpty(Stack s)//判断空栈
{
if(s.top== -1) return true;
else return false;
}
完整程序,C语言,辅助为记录就近访问过节点的非递归后序遍历算法
于 2020-09-10 11:42:28 首次发布