成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一篇學會二叉樹的鏡像

開發 前端
二叉樹鏡像定義: 對于二叉樹中任意節點 root ,設其左 / 右子節點分別為 left, right;則在二叉樹的鏡像中的對應 root節點,其左 / 右子節點分別為 right, left 。

 [[437293]]

本文轉載自微信公眾號「程序員千羽」,作者程序員千羽。轉載本文請聯系程序員千羽公眾號。

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)則會出問題。

復雜度分析:

  • 時間復雜度0(N) : 其中N為二叉樹的節點數量,建立二叉樹鏡像需要遍歷樹的所有節點,占用O(N)時間。
  • 空間復雜度O(N): 最差情況下(當二叉樹退化為鏈表),遞歸時系統需使用O(N)大小的棧空間。
  1. package com.nateshao.sword_offer.topic_21_mirrorTree; 
  2.  
  3. import java.util.Stack; 
  4.  
  5. /** 
  6.  * @date Created by 邵桐杰 on 2021/11/24 22:48 
  7.  * @微信公眾號 程序員千羽 
  8.  * @個人網站 www.nateshao.cn 
  9.  * @博客 https://nateshao.gitee.io 
  10.  * @GitHub https://github.com/nateshao 
  11.  * @Gitee https://gitee.com/nateshao 
  12.  * Description: 劍指 Offer 27. 二叉樹的鏡像 
  13.  */ 
  14. public class Solution { 
  15.     /** 
  16.      * 遞歸 
  17.      * 
  18.      * @param root 
  19.      * @return 
  20.      */ 
  21.     public TreeNode mirrorTree(TreeNode root) { 
  22.         if (root == nullreturn null
  23.         TreeNode node = root.left
  24.         root.left = mirrorTree(root.right); 
  25.         root.right = mirrorTree(node); 
  26.         return root; 
  27.     } 
  28.  
  29.     /** 
  30.      * 解法一:遞歸,時間復雜度:O(n),空間復雜度:O(n) 
  31.      * 
  32.      * @param root 
  33.      * @return 
  34.      */ 
  35.     public boolean isSymmetric(TreeNode root) { 
  36.         if (root == nullreturn true
  37.         return isMirror(root.left, root.right); 
  38.     } 
  39.  
  40.     private boolean isMirror(TreeNode leftNode, TreeNode rightNode) { 
  41.         if (leftNode == null && rightNode == nullreturn true
  42.         if (leftNode == null || rightNode == nullreturn false
  43.  
  44.         return leftNode.val == rightNode.val && isMirror(leftNode.left, rightNode.right) && isMirror(leftNode.right, rightNode.left); 
  45.     } 
  46.  
  47.     public class TreeNode { 
  48.         int val; 
  49.         TreeNode left
  50.         TreeNode right
  51.  
  52.         TreeNode(int x) { 
  53.             val = x; 
  54.         } 
  55.     } 
  56.  

方法二:輔助棧(或隊列)

利用棧(或隊列)遍歷樹的所有節點node,并交換每個node的左/右子節點。

算法流程:

  • 特例處理: 當root為空時,直接返回null ;
  • 初始化: 棧(或隊列),本文用棧,并加入根節點root 。
  • 循環交換: 當棧 stack為控時跳出;
    • 出棧:記為node ;
    • 添加子節點:將node左和右子節點入棧;
    • 交換:交換node的左1右子節點。
  • 返回值:返回根節點root。

復雜度分析:

  • 時間復雜度0(N) :其中N為二叉樹的節點數量,建立二叉樹鏡像需要遍歷樹的所有節點,占用O(N)時間。
  • 空間復雜度O(N) :如下圖所示,最差情況下,棧stack最多同時存儲N+1/2個節點,占用O(N)額外空間。

  1. package com.nateshao.sword_offer.topic_21_mirrorTree; 
  2.  
  3. import java.util.Stack; 
  4.  
  5. /** 
  6.  * @date Created by 邵桐杰 on 2021/11/24 22:48 
  7.  * @微信公眾號 程序員千羽 
  8.  * @個人網站 www.nateshao.cn 
  9.  * @博客 https://nateshao.gitee.io 
  10.  * @GitHub https://github.com/nateshao 
  11.  * @Gitee https://gitee.com/nateshao 
  12.  * Description: 劍指 Offer 27. 二叉樹的鏡像 
  13.  */ 
  14. public class Solution { 
  15.     /** 
  16.      * 棧 
  17.      * 
  18.      * @param root 
  19.      * @return 
  20.      */ 
  21.     public TreeNode mirrorTree1(TreeNode root) { 
  22.         if (root == nullreturn null
  23.         Stack<TreeNode> stack = new Stack<TreeNode>() {{ 
  24.             add(root); 
  25.         }}; 
  26.         while (!stack.isEmpty()) { 
  27.             TreeNode node = stack.pop(); 
  28.             if (node.left != null) stack.add(node.left); 
  29.             if (node.right != null) stack.add(node.right); 
  30.             TreeNode tmp = node.left
  31.             node.left = node.right
  32.             node.right = tmp; 
  33.         } 
  34.         return root; 
  35.     } 
  36.     /** 
  37.      * 解法二:迭代,時間復雜度:O(n),空間復雜度:O(n) 
  38.      * 
  39.      * @param root 
  40.      * @return 
  41.      */ 
  42.     public boolean isSymmetric2(TreeNode root) { 
  43.         Stack<TreeNode> stack = new Stack<>(); 
  44.         stack.push(root); 
  45.         stack.push(root); 
  46.         while (!stack.isEmpty()) { 
  47.             TreeNode t1 = stack.pop(); 
  48.             TreeNode t2 = stack.pop(); 
  49.             if (t1 == null && t2 == nullcontinue
  50.             if (t1 == null || t2 == nullreturn false
  51.             if (t1.val != t2.val) return false
  52.  
  53.             stack.push(t1.left); 
  54.             stack.push(t2.right); 
  55.             stack.push(t1.right); 
  56.             stack.push(t2.left); 
  57.         } 
  58.         return true
  59.     } 
  60.  
  61.     public class TreeNode { 
  62.         int val; 
  63.         TreeNode left
  64.         TreeNode right
  65.  
  66.         TreeNode(int x) { 
  67.             val = x; 
  68.         } 
  69.     } 
  70.  

參考鏈接: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-

 

責任編輯:武曉燕 來源: 程序員千羽
相關推薦

2021-12-17 14:26:58

二叉樹節點數量

2022-07-27 07:45:53

二叉樹鏡像函數

2020-04-27 07:05:58

二叉樹左子樹右子樹

2021-05-06 17:46:30

二叉樹數據結構

2021-04-20 08:37:14

數據結構二叉樹

2021-04-19 07:47:42

數據結構二叉樹Tree

2022-10-26 23:58:02

二叉樹數組算法

2013-07-15 16:35:55

二叉樹迭代器

2021-03-17 08:19:22

二叉樹LeetCode

2021-04-28 20:12:27

數據結構創建

2021-08-27 11:36:44

二叉樹回溯節點

2021-09-29 10:19:00

算法平衡二叉樹

2020-09-23 18:25:40

算法二叉樹多叉樹

2022-11-06 19:43:10

二叉樹指針節點

2018-03-15 08:31:57

二叉樹存儲結構

2022-06-30 22:53:18

數據結構算法

2021-12-05 18:25:12

二叉樹路徑節點

2021-09-15 07:56:32

二叉樹層次遍歷

2021-10-12 09:25:11

二叉樹樹形結構

2022-10-12 23:25:17

二叉樹父節點根節點
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91精品久久久久久久久久小网站 | 最近日韩中文字幕 | 成人国产精品一级毛片视频毛片 | 国产日韩一区二区 | 国产一级特黄视频 | 99久久国产综合精品麻豆 | 狠狠热视频 | www.成人久久 | 国产成人麻豆免费观看 | 中文字幕一区二区三区四区 | 日韩视频观看 | 久久天天综合 | 综合久久一区 | 欧美精品被 | 久久久精彩视频 | 亚洲国产网站 | 日本精品久久久久久久 | 久久久久国产精品免费免费搜索 | 三级高清 | 四虎成人av | 夜夜草视频 | 欧美一级三级 | 一a级片| 一级a爱片久久毛片 | 亚洲精品一区二区三区四区高清 | 波多野结衣中文字幕一区二区三区 | 在线观看av网站永久 | 在线精品国产 | 欧美亚洲在线视频 | 亚洲精品一区二 | 成人高清视频在线观看 | 91资源在线 | 一区二区三区高清 | 日日干夜夜操 | 久久久久国产精品www | www.激情.com| 黄色一级大片在线免费看产 | 在线视频h | 欧美精品久久久久久久久老牛影院 | 久草网站 | 91社区在线高清 |