二叉树的镜像

题目描述

完成一个函数,输入一个二叉树,该函数输出它的镜像。二叉树结点定义如下:

struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};

二叉树镜像的定义:
这里写图片描述

思路分析

以上面这棵树为例,我们先分析以8为根节点以及左右子树是6和10的这棵子树,我们可以看到,对于当前的根节点8,其镜像是将左右子树的位置进行了调换,因此就可以得出下图中的a图,此时以当前结点为根节点的子树其镜像已经做完,我们继续往下遍历,当当前根节点为10时,其镜像也是将左右子树调换,因此可以得到图中的b图;同样,交换6结点的左右子树就可以得到最终的图c。

这里写图片描述

综上,我们就可以得出求一棵二叉树镜像的过程:我们可以采用前序遍历的方法,一遍遍历一边交换,如果当前根节点没有左右结点就不交换,否则就交换左右结点。这里交换左右结点的方法是只要改变根节点的left和right指针即可。

代码如下:

void Mirror(TreeNode *pRoot) {
    if(pRoot == NULL || (pRoot->left==NULL && pRoot->right==NULL))
        return ;

    TreeNode* tmp = pRoot->left;
    pRoot->left = pRoot->right;
    pRoot->right = tmp;

    if(pRoot->left)
        Mirror(pRoot->left);
    if(pRoot->right)
        Mirror(pRoot->right);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值