剑指 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、思路🧠
方法一:辅助栈
遍历树的所有的节点,并交换每个树的的左节点和右节点的位置。
- 特判: 如果头节点
root == null时,返回null - 初始化: 选择使用栈来存储树的节点,并将头节点加入。
- 交换: 当栈
stack为空时结束循环,表示已经到了最底端,已经没有数字了。- 出栈—>将子节点入栈—>交换当前节点的左右节点
- 返回根节点
root。
方法二:辅助队列
该方法实现以方法一思路相同,遍历树的所有的节点,并交换每个树的的左节点和右节点的位置。
- 特判: 如果头节点
root == null时,返回null - 初始化: 选择使用队列来存储树的节点,并将头节点加入。
- 交换: 当队列
queue为空时结束循环,表示已经到了最底端,已经没有数字了。 出栈—>将子节点入队—>交换当前节点的左右节点 - 返回根节点
root。
方法三:迷之递归
考虑递归遍历(dfs)二叉树,交换每个节点的左节点和右节点的位置,即可生成二叉树的镜像。
- 递归终止条件:如果头节点
root == null时,返回null - 递归详解:
- 利用临时节点
t暂存 根节点root的左子节点; - 递归开始 右节点
mirrorTree(root.right),找到右节点的根节点并将返回值作为root的左节点 。 - 递归开始 左节点
mirrorTree(t),找到左节点的根节点并将返回作为root的右节点 。 - 完成交换
- 利用临时节点
- 返回根节点
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)
4、总结
该题目的对树要了解,并掌握DFS,BFS相关知识。对于树,打牢遍历基础。要像有序数组对二分敏感一样,做到树对递归敏感。
❤️来自专栏《LeetCode基础算法题》欢迎订阅❤️
厂长写博客目的初衷很简单,希望大家在学习的过程中少走弯路,多学一些东西,对自己有帮助的留下你的赞赞👍或者关注➕都是对我最大的支持,你的关注和点赞给厂长每天更文的动力。
对文章其中一部分不理解,都可以评论区回复我,我们来一起讨论,共同学习,一起进步!
原题链接:剑指 Offer 27. 二叉树的镜像