二叉樹非遞歸遍歷C語言實現

二叉樹非遞歸遍歷實現——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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章