二叉樹非遞歸遍歷實現——C語言實現
二叉樹非遞歸遍歷:前、中、後序三種遍歷需要用到棧,層序遍歷需要用到隊列。首先用c語言實現棧和隊列,然後再實現二叉樹的非遞歸遍歷
詳細解釋參考:維基百科樹的遍歷http://en.wikipedia.org/wiki/Tree_traversal
編程環境:Visual Studio 2010
static void Visit(Position P)
{
printf("%d ", P->Data);
}
void PreOrder(Tree T)//前序遍歷
{
Stack S;
Position P;
S = InitStack();//創建棧
P = T;
while(P || !StackEmpty(S))//StackEmpty棧是否爲空
{
if(P)
{
Visit(P);
if(P->Right)
Push(P->Right, S);
P = P->Left;
}
else
P = Pop(S);
}
DestoryStack(S);//銷燬棧
}
void InOrder(Tree T)//中序遍歷
{
Stack S;
Position P;
S = InitStack();//創建棧
P = T;
while(P || !StackEmpty(S))
{
if(P)
{
Push(P, S);
P = P->Left;
}
else
{
P = Pop(S);
Visit(P);
P = P->Right;
}
}
DestoryStack(S);//銷燬棧
}
void PostOrder(Tree T)//後序遍歷,根節點會被訪問到兩次,只有最後一次被訪問到纔出棧,即右子樹遍歷完成之後,根節點纔可以出棧
{
Position preNode, currNode;
Stack S;
S = InitStack();
preNode = NULL;
Push(T, S);
while(!StackEmpty(S))//判斷棧是否爲空
{
currNode = Peek(S);//獲取棧頂元素
if(preNode == NULL || preNode->Left == currNode || preNode->Right == currNode)//如果當前節點是根節點或當前節點有左子樹或右子樹
{
if(currNode->Left)//如果有左子樹則左子樹入棧
Push(currNode->Left, S);
else if(currNode->Right)//如果當前節點只有右子樹則右子樹入棧
Push(currNode->Right, S);
}
else if(currNode->Left == preNode)//訪問完左子樹,返回到父親點,然後判斷是否還有右子樹,然後右子樹進棧
{
if(currNode->Right)
Push(currNode->Right, S);
}
else//如果沒有左子樹也沒有右子樹,或者左子樹和右子樹都遍歷完成,則訪問該節點,並將該節點出棧
{
Visit(currNode);
Pop(S);
}
preNode = currNode;
}
DestoryStack(S);//銷燬棧
}
void LevelOrder(Tree T)//層序遍歷
{
Queue Q;
Position P;
if(T == NULL)
return;
Q = InitQueue();
Enqueue(T, Q);
while(!QueueEmpty(Q))//判斷隊列是否爲空
{
P = Dequeue(Q);
Visit(P);
if(P->Left)
Enqueue(P->Left, Q);
if(P->Right)
Enqueue(P->Right, Q);
}
DestoryQueue(Q);//銷燬隊列
}
完整代碼http://download.csdn.net/detail/zitong00/6286797