回 帖 发 新 帖 刷新版面

主题:[讨论]请问二叉树的后序非递归算法怎么写啊

请问二叉树的后序非递归算法怎么写啊

回复列表 (共1个回复)

沙发

里面有递归和非递归的中序遍历,自己看着改,很简单的...

#include<stdio.h>
#include<stdlib.h>
#define ERROR 0
#define OK 1
#define OVERFLOW -2
#define S_INIT_SIZE 100  //存储空间初时分配量
#define SINCREMENT 10   //存储空间分配增量
typedef int Status;
typedef struct BTNode
{  //二叉树的二叉链表存储表示
    char data;
    struct BTNode *lchild,*rchild;  //左右孩子指针
}BTNode,*BT;
typedef struct
{  BT *base;
   BT *top;   //栈顶指针
   int stacksize;  //当前已经分配的存储空间,以元素为单位
}SqS;
Status InitS(SqS &S)
{  //构造一个空栈
    S.base=(BT *)malloc(S_INIT_SIZE*sizeof(BT));
    if(!S.base) exit(OVERFLOW);  //存储分配失败
    S.top=S.base;
    S.stacksize=S_INIT_SIZE;
    return OK;
}//InitS
Status Gettop(SqS S, BT &e)
{  if(S.top==S.base) return ERROR;
   e=*(S.top-1);
   return OK;
}//Gettop
Status Push(SqS &S,BT e)
{  //插入元素为e的栈顶元素
    if(S.top-S.base>=S.stacksize)
    {  //栈满,追加存储空间'
        S.base=(BT *)realloc(S.base,(S.stacksize+SINCREMENT)*sizeof(BT));
        if(!S.base) exit(OVERFLOW);  //存储分配失败
        S.top=S.base+S.stacksize;
        S.stacksize+=SINCREMENT;
    }
    *S.top++=e;
    return OK;
}//Push
Status Pop(SqS &S,BT &e)
{  if(S.top==S.base) return ERROR;
   e=*--S.top;
   return OK;
}//Pop
Status SEmpty(SqS S)
{  if(S.top==S.base) return OK;
   return ERROR;
}//SEmpty
Status CreatBT(BT &T)
{  //构造二叉链表表示的二叉树
    char ch;
    scanf("%c",&ch);
    if(ch==' ') T=NULL;
    else
    {  if(!(T=(BTNode *)malloc(sizeof(BTNode)))) exit(OVERFLOW);
       T->data=ch; //生成跟结点
        CreatBT(T->lchild);  //构造左子树
       CreatBT(T->rchild);  //构造右子树
    }
    return OK;
}//CreatBT
Status Output(char e)
{  printf("%c ",e);
   return OK;
}
Status Inorder(BT T,Status(*Output)(char ch))
{   BT p; SqS S; 
    InitS(S);  p=T;
    while(p||!SEmpty(S))
    {  if(p){Push(S,p); p=p->lchild;}//根指针进栈,遍历左子树
       else 
       {  //根指针退栈,访问根结点,遍历右子树
          Pop(S,p); if(!Output(p->data)) return ERROR;
          p=p->rchild;
       }// else
    }//while
    return OK;
}//Inorder
Status Traverse(BT T,Status(*Output)(char ch))
{  
    if(T)
    {  
        if(Traverse(T->lchild,Output))
            if(Output(T->data))
                if(Traverse(T->rchild,Output))  return OK;
        return ERROR;
    }
    else return OK;
}//Traverse
void main()
{   BT T;
    printf("请出入:");
    CreatBT(T);
    printf("递归输出:");
    Traverse(T,Output);
    printf("\n");
    printf("非递归输出:");
    Inorder(T,Output);
    printf("\n");
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册