码迷,mamicode.com
首页 > 其他好文 > 详细

剑指 Offer 27. 二叉树的镜像

时间:2021-07-06 16:27:13      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:元素   style   持续更新   关注   public   ==   code   off   poll   

1. 题目

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

例如输入:

     4
   /     2     7
 / \   / 1   3 6   9

镜像输出:

     4
   /     7     2
 / \   / 9   6 3   1

2. 示例

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

3. 题解

本题给了三种解法:

  • 递归(最好理解的)
  • 队列

其中,栈和队列一样的,他们类似广度优先,每一行执行交换。

  • 递归
    • 根节点无需交换,只交换左右子节点;
    • 递归的思想就是反复交换子节点即可。
  • 栈和队列
    • 根节点入栈,交换其左右子节点。
    • 然后反复入栈子节点,再交换子节点的左右子节点。

4. 实现

4.1 递归

 1 public TreeNode mirrorTreeA(TreeNode root) {
 2         // 判空
 3         if(root == null) return null;
 4         // 左右节点交换
 5         TreeNode tmp = root.left;
 6         root.left = root.right;
 7         root.right = tmp;
 8         // 递归交换后的左右子树
 9         mirrorTreeA(root.left);
10         mirrorTreeA(root.right);
11         return root;
12 }

4.2 迭代

 1 public TreeNode mirrorTreeB(TreeNode root) {
 2         // 定义栈存储
 3         Stack<TreeNode> stack = new Stack<>();
 4         stack.push(root);
 5         // 广度优先遍历
 6         while (!stack.empty()) {
 7             // 获取栈顶元素
 8             TreeNode tn = stack.peek();
 9             // 弹出栈顶
10             stack.pop();
11             // 栈顶为空,结束
12             if(tn == null) return null;
13             // 交换左右子树
14             TreeNode tmp = tn.left;
15             tn.left = tn.right;
16             tn.right = tmp;
17             // 左右子树子节点重新入栈
18             if(tn.right != null) stack.push(tn.right);
19             if(tn.left != null) stack.push(tn.left);
20         }
21         return root;
22 }

4.3 队列

 1 public TreeNode mirrorTreeC(TreeNode root) {
 2         if(root == null) return null;
 3         // 定义队列存储
 4         Queue<TreeNode> queue = new LinkedList<>();
 5         queue.add(root);
 6         // 广度优先遍历
 7         while (!queue.isEmpty()) {
 8             // 获取队头元素
 9             TreeNode tn = queue.peek();
10             // 弹出队头
11             queue.poll();
12             if(tn == null) return null;
13             // 交换
14             TreeNode tmp = tn.left;
15             tn.left = tn.right;
16             tn.right = tmp;
17             // 左右子树重新入队列
18             if(tn.left != null) queue.add(tn.left);
19             if(tn.right != null) queue.add(tn.right);
20         }
21         return root;
22 }

5. 结语

  努力去爱周围的每一个人,付出,不一定有收获,但是不付出就一定没有收获! 给街头卖艺的人零钱,不和深夜还在摆摊的小贩讨价还价。愿我的博客对你有所帮助(*^▽^*)(*^▽^*)!

  如果客官喜欢小生的园子,记得关注小生哟,小生会持续更新(#^.^#)(#^.^#)。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

剑指 Offer 27. 二叉树的镜像

标签:元素   style   持续更新   关注   public   ==   code   off   poll   

原文地址:https://www.cnblogs.com/haifwu/p/14975617.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!