求二叉树的镜像

博客主要分析了二叉树的镜像,指出其左右是反的。接着探讨了实现二叉树镜像的代码编写,包括递归和非递归两种方式。非递归实现借助队列,类似层序遍历,通过不断交换节点的左右孩子,直至队列为空完成交换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分析:首先我们要明白二叉树的镜像是什么?镜像—顾名思义就是从镜子里投出来的样子,我们也每天都照镜子,都知道从镜子里看到的东西它左右都是反的,下面我把二叉树的镜像画出来,你可能就彻底明白了
这里写图片描述
既然已经知道了二叉树的镜像的形状,那我们就来分析分析代码怎么写吧:
根结点是不用交换的,我们只需要把根节点的左右孩子一交换就行,那我们就需要把根节点的左右子树上的所有结点的左右孩子位置交换
我们下来看看它的代码吧。
递归代码:

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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值