剑指 Offer 27. 二叉树的镜像(226. 翻转二叉树)

题目:

 

 

思路:

【1】这道题本身有点类似于判断是否为(101. 对称二叉树) ,不过本身的话其实也是考虑能不能在原本的节点上变化,还是必须要开一棵新树。而且基于递归的方式是最简单的,虽然容易造成递归层次很深,但是用循环遍历树有些情况确实不好搞。

代码展示:

//时间0 ms击败100%
//内存39.2 MB击败20.65%
//这种是拷贝出一颗新的树,不改动原有的树
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode mirrorTree(TreeNode root) {
        if (root == null) return null;
        TreeNode newTree = new TreeNode(root.val);
        copyTree(root,newTree);
        return newTree;
    }

    public void copyTree(TreeNode oldRoot,TreeNode newRoot) {
        if (oldRoot == null) return;
        if (oldRoot.left != null) {
            newRoot.right = new TreeNode(oldRoot.left.val);
            copyTree(oldRoot.left,newRoot.right);
        }
        if (oldRoot.right != null) {
            newRoot.left = new TreeNode(oldRoot.right.val);
            copyTree(oldRoot.right,newRoot.left);
        }
    }
}

//时间0 ms击败100%
//内存39.1 MB击败30.10%
//时间复杂度:O(N),其中 N 为二叉树节点的数目。
//我们会遍历二叉树中的每一个节点,对每个节点而言,我们在常数时间内交换其两棵子树。
//空间复杂度:O(N)O(N)O(N)。使用的空间由递归栈的深度决定,它等于当前节点在二叉树中的高度。
//在平均情况下,二叉树的高度与节点个数为对数关系,即 O(log⁡N)。而在最坏情况下,树形成链状,空间复杂度为 O(N)。

//这种是在原本的树上进行变换,然后返回还是那个头节点
class Solution {
    public TreeNode mirrorTree(TreeNode root) {
        if (root == null)  return null;
        if (root.left == null && root.right == null) return root;
        TreeNode left = mirrorTree(root.left);
        TreeNode right = mirrorTree(root.right);
        root.left = right;
        root.right = left;
        return root;
    }
}

 

posted @ 2023-02-20 11:53  忧愁的chafry  阅读(11)  评论(0编辑  收藏  举报