码迷,mamicode.com
首页 > 其他好文 > 详细

【数据结构】 非递归前中后序遍历二叉树

时间:2014-10-09 22:32:07      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   os   ar   数据   sp   div   

数据结构学的递归了,深入了解后写一个三序非递归的版本。

 

//测试数据:abd##eg##h##c#f##
#include <cstdio>
#include <iostream>
typedef char ElemType;
typedef struct Node
{
    ElemType elem;
    struct Node *lchild,*rchild;
}Node,*BiTree;
typedef struct{
    BiTree *base;
    BiTree *top;
    int stacksize;
}SqStack;
void InitStack(SqStack &S)
{
    S.base=(BiTree *)malloc(100*sizeof(BiTree));
    if(!S.base) exit(0);
    S.top=S.base;
    S.stacksize=100;
}
void GetTop(SqStack S,BiTree &e)
{
    if(S.top==S.base)exit(0);
    e=*(S.top-1);
}
void Pop(SqStack &S,BiTree &e)
{
    if(S.top==S.base)exit(0);
    e=*--S.top;  //先自减,再取值
}
void Push(SqStack &S,BiTree e)//严谨的话还应该有if(S.top-S.base>=S.stacksize)的判断,此处略去
{
    *S.top++=e;//先赋值,再自加
}
int Empty(SqStack S)
{
    if(S.top==S.base)return 1;
    else return 0;
}
BiTree CreateTree(BiTree &T)
{
    char ch;
    ch=getchar();
    if(ch==#)T=NULL;
    else
    {
        T=(BiTree)malloc (sizeof(Node));
        T->elem=ch;
        T->lchild=(CreateTree(T->lchild));
        T->rchild=(CreateTree(T->rchild));
    }
    return T;
}
void Middleordertraverse(BiTree T) //中序非递归遍历
{
    SqStack S;
    InitStack(S);
    BiTree p=T;
    while(p || !Empty(S))
    {
        if(p)
        {
            Push(S,p);
            p=p->lchild;
        }
        else
        {
            Pop(S,p);
            printf("%c   \n",p->elem);
            p=p->rchild;
        }
    }
}
void Firstordertraverse(BiTree T)//先序非递归遍历
{
    SqStack S;
    InitStack(S);
    BiTree p=T;
    while(p || !Empty(S))
    {
        while(p)
        {
            Push(S,p);
            printf("%c   \n",p->elem);
            p=p->lchild;
        }
        if(!Empty(S))
        {
            Pop(S,p);
            p=p->rchild;
        }
    }
}
void BehindorderTraverse(BiTree T) //后序非递归遍历
{
    SqStack S;
    InitStack(S);
    BiTree pre;//设置标志位,标记是否访问过
    BiTree p=T;
    while(p || !Empty(S))
    {
        while(p)  //左孩子向下压栈  直到最左下
        {
            Push(S,p);
            p=p->lchild;
        }
        GetTop(S,p);   //取当前栈顶  即当前节点最左下
        if(!p->rchild || p->rchild==pre)//没右孩子或右孩子被遍历过
        {
            printf("%c   \n",p->elem);
            pre=p; //标记此节点已经走过
            Pop(S,p);
            if( Empty(S))return ;
            //p回到其父节点(前面肯定了没左子树,而进入此循环显然没右孩子)
            p=NULL;  //不对p左子树遍历
        }
        else p=p->rchild;
    }
    return ;
}
int main()
{
    //freopen("in.txt","r",stdin);
    printf("请给出二叉树的节点序列:  \n");
    BiTree T;
    CreateTree(T);
    printf(" 中序遍历二叉树结果是 :  \n");
    Middleordertraverse(T);
    printf(" 先序遍历二叉树结果是 :  \n");
    Firstordertraverse(T);
    printf(" 后序遍历二叉树结果是 :  \n");
    BehindorderTraverse(T);
    return 0;
}

 

【数据结构】 非递归前中后序遍历二叉树

标签:style   blog   color   io   os   ar   数据   sp   div   

原文地址:http://www.cnblogs.com/balfish/p/4014424.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!