分析:首先我们要明白二叉树的镜像是什么?镜像—顾名思义就是从镜子里投出来的样子,我们也每天都照镜子,都知道从镜子里看到的东西它左右都是反的,下面我把二叉树的镜像画出来,你可能就彻底明白了
既然已经知道了二叉树的镜像的形状,那我们就来分析分析代码怎么写吧:
根结点是不用交换的,我们只需要把根节点的左右孩子一交换就行,那我们就需要把根节点的左右子树上的所有结点的左右孩子位置交换
我们下来看看它的代码吧。
递归代码:
void MirrorBinTree(BTNode* pRoot)
{
if (NULL == pRoot)
return NULL;
Swap(&pRoot->_pLeft, &pRoot->_pRight);
MirrorBinTree(pRoot->_pLeft);
MirrorBinTree(pRoot->_pRight);
}
非递归代码:
非递归的代码实现我们就需要借助队来实现了,就类似于层序遍历的方法了,我们先把根节点入队,当队不空时我们一直进行while循环,每次取队顶元素,如果堆顶元素有左孩子,先把它的左孩子入队,如果有右孩子,再把右孩子入队,此时队里的元素就只要根节点,和它的左右孩子,那我们把它的左右孩子交换,然后让队顶元素出队,这时我们的队顶元素就变成了根节点的左孩子,我们进入while循环,判断根节点的左孩子有无左右结点,然后交换,出栈,交换根节点的右孩子的左右结点…….一直到队空我们就交换完了。
void MirrorBinTreeNor(BTNode* pRoot)
{
Queue q;
QueueInit(&q);
QueuePush(&q, pRoot);
while (!QueueIsEmpty(&q))
{
QDataType cur = QueueFront(&q);
if (cur->_pLeft)
QueuePush(&q, cur->_pLeft);
if (cur->_pRight)
QueuePush(&q, cur->_pRight);
Swap(&cur->_pLeft, &cur->_pRight);
QueuePop(&q);
}
}