二叉樹的遍歷算法


1.前言

定義:二叉樹的遍歷指按某條搜索路徑訪問樹種的每個結點,使得每個結點均被訪問一次,而且僅僅被訪問一次。

二叉樹的鏈式存儲結構如下:

typedef struct BiTNode
{
    ElemType data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

2.先序遍歷

如果二叉樹為空樹,則什么也不做;否則

1)訪問根結點

2)先序遍歷左子樹

3)先序遍歷右子樹

遞歸算法描述如下:

void PreOrder(BiTree T)
{
    if(T!=NULL)
    {
        visit(T);	//訪問根結點
        PreOrder(T->lchild);	//訪問左子樹
        PreOrder(T->rchild);	//訪問右子樹
    }
}

簡記:根左右

3.中序遍歷

若二叉樹為空,則什么也不做;否則

1)中序遍歷左子樹

2)訪問根結點

3)中序遍歷右子樹

遞歸算法描述如下:

void InOrder(BiTree T)
{
    if(T!=NULL)
    {
        InOrder(T->lchild);
        visit(T);
        InOrder(T->rchild);
    }
}

簡記:左根右

4.后序遍歷

若二叉樹為空,則什么也不做;否則

1)后序遍歷左子樹

2)后序遍歷右子樹

3)訪問根節點

遞歸算法描述如下:

void PostOrder(BiTree T)
{
    if(T!=NULL)
    {
        PostOrder(T->lchild);
        PostOrder(T->rchild);
        visit(T);
    }
}

簡記:左右根

5.層次遍歷

算法描述如下:

void LevelOrder(BiTree T)
{
    InitQueue(Q);	//初始化輔助隊列
    BiTree p;	
    EnQueue(Q,T);	//根結點入隊
    while(!isEmpty(Q))	//隊列不空,則繼續循環
    {
        DeQueue(Q,p);	//隊頭結點出隊
        visit(p);	//訪問出隊結點
        if(p->lchild!=NULL)
        {
            //左子樹不空,則左子樹根結點入隊
            EnQueue(Q,p->lchild);
        }
        
        if(p->rchild!=NULL)
        {
            //右子樹不空,則右子樹根結點入隊
            EnQueue(Q,p->rchild);
        }
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM