二叉树的镜像

面试题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);
	}
}


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