剑指offer-JZ27 二叉树的镜像(C++,附思路)

描述

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

数据范围:二叉树的节点数[0,1000] , 二叉树每个节点的值 [0,1000]

要求: 空间复杂度 O(n)。本题也有原地操作,即空间复杂度 O(1) 的解法,时间复杂度 O(n)

比如:

源二叉树

剑指offer-JZ27 二叉树的镜像(C++,附思路)_第1张图片

镜像二叉树

剑指offer-JZ27 二叉树的镜像(C++,附思路)_第2张图片

示例1

输入:

{8,6,10,5,7,9,11}

返回值:

{8,10,6,11,9,7,5}

说明:

如题面所示    

示例2

输入:

{}

返回值:

{}

思路:

这个题怎么想到用递归做呢,是从题目里的“有原地翻转的解法”得来的灵感。因为是全体镜像,所以不能简简单单地交换节点所对应的值,所以就是交换左指针和右指针指向的两节点,然后不断重复这个动作,到什么时候为止呢?不能交换的时候,也就是不存在结点的时候就不交换了。

代码也考虑到单支树了,不必另外写仅有一个节点的情况。举个例子,因为是先左再右,所以如果结构仅仅是左边单支树的话,在第一次遍历的时候就不会走到右子节点的那一句代码,是在整个镜像都完成了之后才走右节点,而右节点又是NULL,所以每一步就都直接返回了。

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param pRoot TreeNode类 
     * @return TreeNode类
     */
    TreeNode* Mirror(TreeNode* pRoot) {
        // write code here
        //用递归!
        if(!pRoot)
            return NULL;
        else
        {
            TreeNode* ptr=pRoot->left;
            pRoot->left=pRoot->right;
            pRoot->right=ptr;
            Mirror(pRoot->left);
            Mirror(pRoot->right);
        }
        return pRoot;
    }
};

你可能感兴趣的:(剑指offer,c++,剑指offer,二叉树,算法)