二叉樹的鏡像

面試題19:二叉樹的鏡像(來自《劍指Offer》)

題目:請完成一個函數,輸入一個二叉樹,該函數輸出它的鏡像。

二叉樹結點的定義如下:

struct BinaryTreeNode
{
	int data;
	BinaryTreeNode *Left;
	BinaryTreeNode *Right;
};

通過畫圖,可知二叉樹的鏡像如下圖所示:


根據畫圖可得到這樣的思路:先序遍歷樹的每個結點,若遍歷到的結點有子結點,則交換它的兩個子結點。

有兩種實現方法:

1.遞歸實現

void MirroRecursively(BinaryTreeNode *pNode)
{
	if(NULL == pNode)
		return;
	if(NULL == pNode->Left && NULL == pNode->Right)
		return;
	
	BinaryTreeNode *pTemp = pNode->Left;
	pNode->Left = pNode->Right;
	pNode->Right = pTemp;
	
	if(pNode->Left)
		MirroRecursively(pNode->Left);
	if(pNode->Right)
		MirroRecursively(pNode->Right);
}

2.非遞歸實現,即使用循環實現

void MirrorNonRecurively(BinaryTreeNode *pNode)
{
	if(NULL == pNode)
		return;

	stack<BinaryTreeNode *> stackTreeNode;
	stackTreeNode.push(pNode);

	while(stackTreeNode.size())
	{
		BinaryTreeNode *pNode = stackTreeNode.top();
		stackTreeNode.pop();

		if(NULL != pNode->Left || NULL != pNode->Right)
		{
			BinaryTreeNode *pTemp = pNode->Left;
			pNode->Left = pNode->Right;
			pNode->Right = pTemp;
		}
		
		if(NULL != pNode->Left)
			stackTreeNode.push(pNode->Left);

		if(NULL != pNode->Right)
			stackTreeNode.push(pNode->Right);
	}
}


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