首頁>Club>
3
回覆列表
  • 1 # 梁範志

    這裡有二叉樹先序、中序、後序三種遍歷的非遞迴演算法,此三個演算法可視為標準演算法。

    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

  • 2 # 使用者3845252462615

    中序遍歷

    中序遍歷比較重要,規則為:左子樹,根節點,右子樹。

    一切都是從根節點開始的。

    從A開始,因為A有B左子樹,所以A不是第一個點。

    B子樹沒有左子樹,所以B為根節點,結果為B。我們知道其實一切都是從根節點開始,在這裡是A。

    在這種排序遍歷中,和一個佇列有關。

    先將A進入佇列,佇列中為:A;

    然後A出佇列,輸出A,左右子樹的B,E進入佇列,佇列中為:BE。

    然後B出佇列,輸出AB,C進入佇列,佇列中為:EC。

    然後E出佇列,輸出為ABE,F進入佇列,佇列中為:CF。

    然後c出佇列,輸入為ABEC,D進入佇列,佇列中為:FD。

    然後F出佇列,輸入為ABECF,G進入佇列,佇列為:DG.

    然後D出佇列,然後輸入為ABECFD,佇列為:G

    然後G出佇列,然後輸入為ABECFDG,佇列為:HK

    然後HK分別出佇列,輸出為ABECFDGHK。

  • 中秋節和大豐收的關聯?
  • 如果我將離開你這首歌的歌名?