完整程序,C语言,辅助为记录就近访问过节点的非递归后序遍历算法


**完整程序,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;
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

初一扛把子007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值