数据库第4天

非递归二叉树

#include<stdio.h>
#include<malloc.h>
typedef struct Node{
    char data;
    struct Node *lchild,*rchild;
}bintree;
typedef struct {//栈结构定义
    bintree* a[100];
    int tag[100];//为栈中每个元素做标记,用于后序遍历
    int top; //栈顶指针
}seqstack;
void push (seqstack* s,bintree *tree){//进栈
    s->a[s->top]=tree;//把元素存在栈中
    s->tag[s->top]=0;
    s->top++;
}
bintree* pop(seqstack*s){//出栈
       s->top--;
        return s->a[s->top];
    }
void initStack(seqstack*s){
   s->top=0;
}
int isEmpty(seqstack *s){
    if( s->top==0) return 1;
    else  return 0;
}
bintree* creat(){
   bintree*tree;
   char x=getchar();
   if(x=='#')   return NULL; //这个函数没有返回类型不能返回NULL
   tree=(bintree*)malloc(sizeof(bintree));
   tree->lchild=NULL; tree->rchild=NULL;
   tree->data=x;
   tree->lchild=creat();
   tree->rchild=creat();
   return tree;
}
void preorder(bintree *tree){
   seqstack s;
   initStack(&s);
   while(tree!=NULL||isEmpty(&s)==0){
   if(tree!=NULL){
    printf("%c ",tree->data);
    push(&s,tree);
    tree=tree->lchild;
    }
    else{
    tree=pop(&s);
    tree=tree->rchild;
    }
   }
}
void inorder(bintree *tree){
   seqstack s;
   initStack(&s);
   while(tree!=NULL||isEmpty(&s)==0){
   if(tree!=NULL){
    push(&s,tree);
    tree=tree->lchild;
    }
    else{
    tree=pop(&s);
    printf("%c ",tree->data);
    tree=tree->rchild;
    }
   }
}
bintree *poptag(seqstack*s){
   return s->a[s->top-1];
}
void tag_(seqstack*s){
  s->tag[s->top-1]=1;
}
int istag(seqstack*s){
  if(s->tag[s->top-1]==1)  return 1;
  else return 0;
}
void postorder(bintree *tree){
   seqstack s;
   initStack(&s);
   while(tree!=NULL||isEmpty(&s)==0){
    if(tree!=NULL){
    push(&s,tree);
    tree=tree->lchild;
    }
    else if(istag(&s)==1){
    tree=pop(&s);
    printf("%c ",tree->data);
    tree=NULL;
    }
    else {
    tree=poptag(&s);
    tag_(&s);
    tree=tree->rchild;
    }
   }
}
main(){
    bintree *tree;
    printf("请输入一组字符建树,#表示NULL:\n");
    tree=creat();
    printf("\n pre  Order is : ");
    preorder(tree);
    printf("\n inorder Order is : ");
    inorder(tree);
    printf("\n postorder Order is : ");
    postorder(tree);
}
//ABD###CE##F##

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值