「剑指 Offer 27.二叉树的镜像」

「剑指 Offer 27.二叉树的镜像」
题目描述(level 简单)

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

示例
例如输入:
     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
思路分析(BFS)

输出二叉树的镜像,根据题目意思,即对于任意一个节点将其左右节点进行交换即可。而对于二叉树的遍历问题自然会想到广度优先搜索的层序遍历BFS,以及深度优先的DFS。先考虑使用BFS广度优先搜索,借助队列来实现:

  • 初始化队列,添加入根节点root
  • 循环遍历,交换左右节点,直到遍历完整颗树。
  • 返回修改后的二叉树root
代码实现
public class Solution {
  public TreeNode mirrorTree(TreeNode root) {
    if (null == root) {
      return null;
    }
    Queue<TreeNode> queue = new LinkedList<>();
    //加入根节点
    queue.add(root);
    while (!queue.isEmpty()) {
      TreeNode node = queue.poll();
			//判断是否有左节点并加入到队列
      if (null != node.left) {
        queue.add(node.left);
      }
      //判断是否有右节点并加入到队列
      if (null != node.right) {
        queue.add(node.right);
      }
			//交换操作
      TreeNode temp = node.left;
      node.left = node.right;
      node.right = temp;
    }
    return root;
  }
}

这里其实并没有用到特列的特性,使用栈也是同样的效果

思路分析(递归)

递归的出口很容易找到当null == root是退出递归。写递归时,其实总有一个误区,就是想在大脑中将递归的过程平铺开来。递归本身就是无限套娃,想再大脑中模拟,往往会陷入死胡同。当然递归本身就存在两个过程:递推回溯。只需要找到出口,需要干什么,中间的过程可不必过于纠结。

代码实现
public class Solution {
  public TreeNode mirrorTree(TreeNode root) {
    if (null == root) {
      return null;
    }
    TreeNode leftNode = mirrorTree(root.left);
    TreeNode rightNode = mirrorTree(root.right);
    root.left = rightNode;
    root.right = leftNode;
    return root;
  }
}

//简化后
public class Solution {
  public TreeNode mirrorTree(TreeNode root) {
    if (null == root) {
      return null;
    }
    TreeNode leftNode = mirrorTree(root.left);
    root.left = mirrorTree(root.right);
    root.right = leftNode;
    return root;
  }
}
复杂度

时间复杂度(递归与辅助队列)O(N):均需要遍历整颗树的节点。

空间复杂度(递归与辅助队列)O(N):考虑到二叉树退化成链表的情况。

链接

二叉树的镜像

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快乐二狗呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值