Day29:二叉树镜像

63 阅读2分钟

描述

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

数据范围:二叉树的节点数 0≤�≤10000≤n≤1000 , 二叉树每个节点的值 0≤���≤10000≤val≤1000

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

题源:二叉树的镜像_牛客题霸_牛客网 (nowcoder.com)

比如:

源二叉树

镜像二叉树

示例1

输入:

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

返回值:

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

说明:

如题面所示    

示例2

输入:

{}

返回值:

{}

思路:

因为我们需要将二叉树镜像,意味着每个左右子树都会交换位置,如果我们从上到下对遍历到的节点交换位置,但是它们后面的节点无法跟着他们一起被交换,因此我们可以考虑自底向上对每两个相对位置的节点交换位置,这样往上各个子树也会被交换位置。

自底向上的遍历方式,我们可以采用后序递归的方法。

递归是一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。因此递归过程,最重要的就是查看能不能讲原本的问题分解为更小的子问题,这是使用递归的关键。

而二叉树的递归,则是将某个节点的左子树、右子树看成一颗完整的树,那么对于子树的访问或者操作就是对于原树的访问或者操作的子问题,因此可以自我调用函数不断进入子树。

public TreeNode Mirror (TreeNode pRoot) {
        if (pRoot == null)return null;
        TreeNode left = Mirror(pRoot.left);
        TreeNode right = Mirror(pRoot.right);
        pRoot.left = right;
         pRoot.right = left;
        return pRoot;
    }
    ````