二叉树三种遍历的非递归算法笔记

   /2005-05-08

涓€鏉ザ鑼剁殑閽卞氨鍙互涔板埌鑰冪爺涓撲笟璇捐祫鏂欙紒
2涓囩鑰冪爺鐢靛瓙涔︼紙棰樺簱銆佽棰戙€佸叏濂楄祫鏂欙級鍙婂巻骞寸湡棰橈紝娑电洊547鎵€闄㈡牎4涓囦綑涓€冪爺鑰冨崥涓撲笟绉戠洰銆佽€冪爺鍏叡璇撅紙鏀挎不鑻辫鏁板锛夈€�40绉嶄笓涓氱澹紙閲戣瀺纭曞+銆丮BA銆佸浗闄呭晢鍔$澹€佹柊闂讳紶鎾澹€佺ぞ浼氬伐浣滅澹瓑锛夈€�28绫诲悓绛夊鍔涚敵纭曚笓涓氥€�1130绉嶇粡鍏告暀鏉愩€�

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

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


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


相关话题/

  • 领限时大额优惠券,享本站正版考研考试资料!
    大额优惠券
    优惠券领取后72小时内有效,10万种最新考研考试考证类电子打印资料任你选。涵盖全国500余所院校考研专业课、200多种职业资格考试、1100多种经典教材,产品类型包含电子书、题库、全套资料以及视频,无论您是考研复习、考证刷题,还是考前冲刺等,不同类型的产品可满足您学习上的不同需求。 ...
    本站小编 Free壹佰分学习网 2022-09-19
鐐瑰嚮绔嬪嵆鎼滅储2涓囩鑰冪爺鐢靛瓙鐗堣祫鏂欙紒
澶ч儴鍒嗙闉嬮兘鏄涓€娆¤€冪爺锛屽浜庡浣曟煡鎵句笓涓氳鎸囧畾鏁欐潗锛屾垨璁告湁寰堝鐤戦棶銆侳ree澹逛桨鍒嗗涔犵綉鑰冪爺娣辫€曚笓涓氳杈呭20骞达紝鎬荤粨浜嗚秴瀹炵敤鐨勬寚瀹氭暀鏉愭煡璇㈡柟娉曞強澶嶄範鏂规硶锛屾湁闇€瑕佺殑鐪嬭繃鏉�