剑指 Offer 11. 旋转数组的最小数字

209 阅读3分钟

剑指 Offer 11. 旋转数组的最小数字

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

1、题目📑

请完成一个函数,输入一个二叉树,该函数输出它的镜像。

例如输入:

     4

   /   \

  2     7

 / \   / \

1   3 6   9

镜像输出:

     4

   /   \

  7     2

 / \   / \

9   6 3   1

实例1

输入:root = [4,2,7,1,3,6,9]

输出:[4,7,2,9,6,3,1]

限制

  • 0 <= 节点个数 <= 1000

2、思路🧠

方法一:辅助栈

遍历树的所有的节点,并交换每个树的的左节点和右节点的位置。

  1. 特判: 如果头节点 root == null时,返回 null
  2. 初始化: 选择使用栈来存储树的节点,并将头节点加入。
  3. 交换: 当栈 stack 为空时结束循环,表示已经到了最底端,已经没有数字了。
    • 出栈—>将子节点入栈—>交换当前节点的左右节点
  4. 返回根节点 root

方法二:辅助队列

该方法实现以方法一思路相同,遍历树的所有的节点,并交换每个树的的左节点和右节点的位置。

  1. 特判: 如果头节点 root == null时,返回 null
  2. 初始化: 选择使用队列来存储树的节点,并将头节点加入。
  3. 交换: 当队列 queue 为空时结束循环,表示已经到了最底端,已经没有数字了。 出栈—>将子节点入队—>交换当前节点的左右节点
  4. 返回根节点 root

方法三:迷之递归

考虑递归遍历(dfs)二叉树,交换每个节点的左节点和右节点的位置,即可生成二叉树的镜像。

  1. 递归终止条件:如果头节点 root == null时,返回 null
  2. 递归详解:
    • 利用临时节点 t 暂存 根节点root 的左子节点;
    • 递归开始 右节点 mirrorTree(root.right) ,找到右节点的根节点并将返回值作为root的左节点 。
    • 递归开始 左节点 mirrorTree(t) ,找到左节点的根节点并将返回作为root的右节点 。
    • 完成交换
  3. 返回根节点 root

废话少说~~~~~上代码!

3、代码👨‍💻

第一次commit AC

/**
 * 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;
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode node = stack.pop();
            if(node.left != null) stack.push(node.left);
            if(node.right != null) stack.push(node.right);
            TreeNode t = node.left;
            node.left = node.right;
            node.right = t;
        }
        return root;
    }
}

时间复杂度:O(N) N 为二叉树的节点数量

空间复杂度:O(N)

第二次commit AC

/**
 * 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;
        LinkedList<TreeNode> q = new LinkedList<>();
        q.add(root);
        while(!q.isEmpty()){
            TreeNode node = q.pollLast();
            if(node.left != null) q.add(node.left);
            if(node.right != null) q.add(node.right);
            TreeNode t = node.left;
            node.left = node.right;
            node.right = t;
        }
        return root;
    }
}

时间复杂度:O(N) N 为二叉树的节点数量

空间复杂度:O(N)

第Three次commit AC

**
 * 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 temp = root.left;
        root.left = mirrorTree(root.right);
        root.right = mirrorTree(temp);
        return root;
    }
}

时间复杂度:O(N) N 为二叉树的节点数量

空间复杂度:O(N)

image-20220314171121870

4、总结

该题目的对树要了解,并掌握DFS,BFS相关知识。对于树,打牢遍历基础。要像有序数组对二分敏感一样,做到树对递归敏感。

❤️‍来自专栏《LeetCode基础算法题》欢迎订阅❤️‍

厂长写博客目的初衷很简单,希望大家在学习的过程中少走弯路,多学一些东西,对自己有帮助的留下你的赞赞👍或者关注➕都是对我最大的支持,你的关注和点赞给厂长每天更文的动力。

对文章其中一部分不理解,都可以评论区回复我,我们来一起讨论,共同学习,一起进步!

原题链接:剑指 Offer 27. 二叉树的镜像