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);
}
}
}