文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

一篇学会二叉树的镜像

2024-12-02 15:23

关注

本文转载自微信公众号「程序员千羽」,作者程序员千羽。转载本文请联系程序员千羽公众号。

Leetcode : https://leetcode-cn.com/problems/er-cha-shu-de-jing-xiang-lcof

“GitHub : https://github.com/nateshao/leetcode/blob/main/algo-notes/src/main/java/com/nateshao/sword_offer/topic_21_mirrorTree/Solution.java

 二叉树的镜像

“题目描述 :请完成一个函数,输入一个二叉树,该函数输出它的镜像。例如输入:

  1.     4 
  2.    /   \ 
  3.   2     7 
  4.  / \   / \ 
  5. 1   3 6   9 

镜像输出:

  1.       4 
  2.     /   \ 
  3.    7     2 
  4.  / \   / \ 
  5. 9   6 3   1 

示例 1:

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

限制:0 <= 节点个数 <= 1000

分析

二叉树镜像定义: 对于二叉树中任意节点 root ,设其左 / 右子节点分别为 left, right;则在二叉树的镜像中的对应 root节点,其左 / 右子节点分别为 right, left 。

方法一:递归法

根据二叉树镜像的定义,考虑递归遍历(dfs)二叉树,交换每个节点的左 / 右子节点,即可生成二叉树的镜像。

递归解析:

终止条件: 当节点 root为空时(即越过叶节点),则返回 null ;

递推工作:

初始化节点tmp,用于暂存root的左子节点; .

开启递归右子节点mirrorTree(root.right),并将返回值作为root的左子节点。

开启递归左子节点mirrorTree(tmp) ,并将返回值作为root的右子节点。

返回值:返回当前节点root ;

“Q:为何需要暂存root的左子节点? A:在递归右子节 点“root.left = mirrorTree(root.right);"执行完毕后,root.left 的值已经发生改变,此时递归左子节点mirrorTree(root.left)则会出问题。

复杂度分析:

  1. package com.nateshao.sword_offer.topic_21_mirrorTree; 
  2.  
  3. import java.util.Stack; 
  4.  
  5.  
  6. public class Solution { 
  7.      
  8.     public TreeNode mirrorTree(TreeNode root) { 
  9.         if (root == nullreturn null
  10.         TreeNode node = root.left
  11.         root.left = mirrorTree(root.right); 
  12.         root.right = mirrorTree(node); 
  13.         return root; 
  14.     } 
  15.  
  16.      
  17.     public boolean isSymmetric(TreeNode root) { 
  18.         if (root == nullreturn true
  19.         return isMirror(root.left, root.right); 
  20.     } 
  21.  
  22.     private boolean isMirror(TreeNode leftNode, TreeNode rightNode) { 
  23.         if (leftNode == null && rightNode == nullreturn true
  24.         if (leftNode == null || rightNode == nullreturn false
  25.  
  26.         return leftNode.val == rightNode.val && isMirror(leftNode.left, rightNode.right) && isMirror(leftNode.right, rightNode.left); 
  27.     } 
  28.  
  29.     public class TreeNode { 
  30.         int val; 
  31.         TreeNode left
  32.         TreeNode right
  33.  
  34.         TreeNode(int x) { 
  35.             val = x; 
  36.         } 
  37.     } 
  38.  

方法二:辅助栈(或队列)

利用栈(或队列)遍历树的所有节点node,并交换每个node的左/右子节点。

算法流程:

复杂度分析:

  1. package com.nateshao.sword_offer.topic_21_mirrorTree; 
  2.  
  3. import java.util.Stack; 
  4.  
  5.  
  6. public class Solution { 
  7.      
  8.     public TreeNode mirrorTree1(TreeNode root) { 
  9.         if (root == nullreturn null
  10.         Stack stack = new Stack() {{ 
  11.             add(root); 
  12.         }}; 
  13.         while (!stack.isEmpty()) { 
  14.             TreeNode node = stack.pop(); 
  15.             if (node.left != null) stack.add(node.left); 
  16.             if (node.right != null) stack.add(node.right); 
  17.             TreeNode tmp = node.left
  18.             node.left = node.right
  19.             node.right = tmp; 
  20.         } 
  21.         return root; 
  22.     } 
  23.      
  24.     public boolean isSymmetric2(TreeNode root) { 
  25.         Stack stack = new Stack<>(); 
  26.         stack.push(root); 
  27.         stack.push(root); 
  28.         while (!stack.isEmpty()) { 
  29.             TreeNode t1 = stack.pop(); 
  30.             TreeNode t2 = stack.pop(); 
  31.             if (t1 == null && t2 == nullcontinue
  32.             if (t1 == null || t2 == nullreturn false
  33.             if (t1.val != t2.val) return false
  34.  
  35.             stack.push(t1.left); 
  36.             stack.push(t2.right); 
  37.             stack.push(t1.right); 
  38.             stack.push(t2.left); 
  39.         } 
  40.         return true
  41.     } 
  42.  
  43.     public class TreeNode { 
  44.         int val; 
  45.         TreeNode left
  46.         TreeNode right
  47.  
  48.         TreeNode(int x) { 
  49.             val = x; 
  50.         } 
  51.     } 
  52.  

参考链接:https://leetcode-cn.com/problems/er-cha-shu-de-jing-xiang-lcof/solution/mian-shi-ti-27-er-cha-shu-de-jing-xiang-di-gui-fu-

 

来源:程序员千羽内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯