剑指offer 面试题: 求二叉树的镜像(递归、循环、及测试用例)

本文详细介绍了一种常见的数据结构操作——二叉树镜像的实现方法,包括递归和迭代两种方式。通过画图找到规律,利用先序遍历交换非叶子节点的左右子节点,实现了二叉树的镜像变换。

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

  • 编程是为了让程序变成自己喜欢的模样!
  • 坚持总结经验才是王道
  • 代码的样子决定了你的能力!

题目:完成一个函数,输入一颗二叉树、该函数输出它的镜像。

  • 二叉树定义如下:
struct BinaryTreeNode
{
    int 		       m_nValue;
    BinaryTreeNode*   m_left;
    BinaryTreeNode*   m_right;
}
  • 输入描述:
    源二叉树:
    在这里插入图片描述

镜像二叉树:
在这里插入图片描述

思路: 在做题时大可以画图,在画图的过程中找到规律!!!

先序遍历这棵树的每个结点,如果遍历到的结点有子节点,则交换它的两个子节点。当交换完所有非叶子节点时,就得到了树的镜像!!!!!!!

  • 递归实现二叉树镜像,先序遍历!
    代码:
/**
    考察面试者将问题通过画图抽象成思路实现代码的能力;
    遍历并交换所有非叶子节点的左、右子节点。
*/
void MirrorRecursively(BinaryTreeNode* pNode)
{
    if(pNode == nullptr)
    {
        return;
    }
    if(pNode->m_left == nullptr && pNode->m_right == nullptr)
    {
        return;
    }
    // exchange the two children
    BinaryTreeNode* temp = pNode->m_left;
    pNode->m_left = pNode->m_right;
    pNode->m_right = temp;

    // continue recursive the two child!
    if(pNode->m_left)
    {
        MirrorRecursively(pNode->m_left);
    }
    if(pNode->m_right)
    {
        MirrorRecursively(pNode->m_right);
    }
}
方法二:
  • 既然先序遍历可以用递归实现,也可以用循环迭代实现!!!
  • 所用数据结构 栈!!!

代码:

void  MirrorCirculate(BinaryTreeNode* root)
{
    if(root == nullptr)
        return;
    stack<BinaryTreeNode*> stackTreeNode;
    stackTreeNode.push(root);

    while(!stackTreeNode.empty())
    {
        BinaryTreeNode * parent = stackTreeNode.top();
        stackTreeNode.pop();

        BinaryTreeNode* temp = parent->m_left;
        parent->m_left = parent->m_right;
        parent->m_right = temp;

        if(parent->m_left)
        {
            stackTreeNode.push(parent->m_left);
        }

        if(parent->m_right)
        {
            stackTreeNode.push(parent->m_right);
        }
    }
}
功能呢测试分五种情况
  1. 测试完全二叉树:除了叶子节点,其他节点都有两个子节点
  2. 测试二叉树:出叶子结点之外,左右的结点都有且只有一个左子结点
  3. 测试二叉树:出叶子结点之外,左右的结点都有且只有一个右子结点
  4. 测试空二叉树:根结点为空指针
  5. 测试只有一个结点的二叉树
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值