剑指offer18_二叉树的镜像_题解

二叉树的镜像

题目描述

操作给定的二叉树,将其变换为源二叉树的镜像。

示例1

二叉树的镜像定义:源二叉树 
 	    8
 	   /  \
 	  6   10
 	 / \  / \
 	5  7 9 11
 	镜像二叉树
 	    8
 	   /  \
 	  10   6
 	 / \  / \
 	11 9 7  5

分析

方案一:递归

递归遍历二叉树,交换每个孩子的左右子节点,即可生成二叉树的镜像

/**
时间复杂度:O(n)
其中 N 为二叉树的节点数量,建立二叉树镜像需要遍历树的所有节点,占用 O(N) 时间。
空间复杂度:O(n)
最差情况下(当为满二叉树时),栈 stack 最多同时存储 N/2 个节点,占用 O(N) 额外空间。
**/
class Solution
{
public:
    void Mirror(TreeNode *pRoot)
    {
        // 当节点 root 为空时(即越过叶节点),则返回 null
        if (pRoot == NULL)
        {
            return;
        }
        // 交换根节点的左右孩子
        swap(pRoot->left, pRoot->right);
        // 递归对左子树进行镜像变换
        Mirror(pRoot->left);
        // 递归对右子树进行镜像变换
        Mirror(pRoot->right);
    }
};

方法二:迭代(利用队列实现)

利用栈(或队列)遍历树的所有节点,并交换每个节点的左右子节点。

class Solution
{
public:
    void Mirror(TreeNode *root)
    {
        // 初始化队列,并加入根节点root
        queue<TreeNode *> q;
        q.push(root);
        // 当队列q为空时跳出
        while (!q.empty())
        {
            TreeNode *top = q.front();
            q.pop(); //出队
            // 添加左右子节点
            if (top->left)
                q.push(top->left);
            if (top->right)
                q.push(top->right);
            // 交换左右子节点
            swap(top->left, top->right);
        }
    }
};

posted @ 2020-12-16 23:29  RiverCold  阅读(69)  评论(0编辑  收藏  举报