考研信息港
考研专业课辅导班火热报名中……
首   页 | 考研新闻 | 国家政策 | 招生信息 | 调剂专栏 | 分数信息 | 考研感受 | 资料中心
政治复习 | 英语复习 | 数学复习 | 工商硕士 | 公共硕士 | 法律硕士 | 工程硕士 | 教育硕士

学校专栏: 北大 | 清华 | 人大 | 北师 | 北理 | 北邮 | 北航 | 贸大 | 北广 | 中财 | 更多
[广告]34所名校考研专业课复习资讯汇总
特别专题:行政管理考研 计算机考研 社会保障考研 人力资源考研 法学考研 新闻考研 经济考研


您现在的位置: 考研信息港 >> 文章中心 >> 计算机考研专栏(计算机考研网) >> 文章正文

二叉树三种遍历的非递归算法(背诵版)

作者:佚名    文章来源:考研考研站    点击数:    更新时间:2006-1-4 【字体:

本贴给出二叉树先序、中序、后序三种遍历的非递归算法,此三个算法可视为标准算法,直接用于考研答题。

1.先序遍历非递归算法
#define maxsize 100
typedef struct
{
    Bitree Elem[maxsize];
    int top;
}SqStack;

void PreOrderUnrec(Bitree t)
{
    SqStack s;
    StackInit(s);
    p=t;
   
    while (p!=null || !StackEmpty(s))
    {
        while (p!=null)             //遍历左子树
        {
            visite(p->data);
            push(s,p);
            p=p->lchild;      
        }//endwhile
        
        if (!StackEmpty(s))         //通过下一次循环中的内嵌while实现右子树遍历
        {
            p=pop(s);
            p=p->rchild;        
        }//endif
               
    }//endwhile
   
}//PreOrderUnrec

2.中序遍历非递归算法
#define maxsize 100
typedef struct
{
    Bitree Elem[maxsize];
    int top;
}SqStack;

void InOrderUnrec(Bitree t)
{
    SqStack s;
    StackInit(s);
    p=t;
    while (p!=null || !StackEmpty(s))
    {
        while (p!=null)             //遍历左子树
        {
            push(s,p);
            p=p->lchild;
        }//endwhile
        
        if (!StackEmpty(s))
        {
            p=pop(s);
            visite(p->data);        //访问根结点
            p=p->rchild;            //通过下一次循环实现右子树遍历
        }//endif   
   
    }//endwhile

}//InOrderUnrec


3.后序遍历非递归算法
#define maxsize 100
typedef enum{L,R} tagtype;
typedef struct
{
    Bitree ptr;
    tagtype tag;
}stacknode;

typedef struct
{
    stacknode Elem[maxsize];
    int top;
}SqStack;

void PostOrderUnrec(Bitree t)
{
    SqStack s;
    stacknode x;
    StackInit(s);
    p=t;
   
    do
    {
        while (p!=null)        //遍历左子树
        {
            x.ptr = p;
            x.tag = L;         //标记为左子树
            push(s,x);
            p=p->lchild;
        }
   
        while (!StackEmpty(s) && s.Elem[s.top].tag==R)  
        {
            x = pop(s);
            p = x.ptr;
            visite(p->data);   //tag为R,表示右子树访问完毕,故访问根结点      
        }
        
        if (!StackEmpty(s))
        {
            s.Elem[s.top].tag =R;     //遍历右子树
            p=s.Elem[s.top].ptr->rchild;        
        }   
    }while (!StackEmpty(s));
}//PostOrderUnrec

文章录入:admin    责任编辑:admin 




  • 上一篇文章:
  • 下一篇文章:

  • 相关文章
    没有相关文章