自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一篇學(xué)會(huì)二叉樹的鏡像

開發(fā) 前端
二叉樹鏡像定義: 對(duì)于二叉樹中任意節(jié)點(diǎn) root ,設(shè)其左 / 右子節(jié)點(diǎn)分別為 left, right;則在二叉樹的鏡像中的對(duì)應(yīng) root節(jié)點(diǎn),其左 / 右子節(jié)點(diǎn)分別為 right, left 。

 [[437293]]

本文轉(zhuǎn)載自微信公眾號(hào)「程序員千羽」,作者程序員千羽。轉(zhuǎn)載本文請(qǐng)聯(lián)系程序員千羽公眾號(hào)。

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

 二叉樹的鏡像

“題目描述 :請(qǐng)完成一個(gè)函數(shù),輸入一個(gè)二叉樹,該函數(shù)輸出它的鏡像。例如輸入:

  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 <= 節(jié)點(diǎn)個(gè)數(shù) <= 1000

分析

二叉樹鏡像定義: 對(duì)于二叉樹中任意節(jié)點(diǎn) root ,設(shè)其左 / 右子節(jié)點(diǎn)分別為 left, right;則在二叉樹的鏡像中的對(duì)應(yīng) root節(jié)點(diǎn),其左 / 右子節(jié)點(diǎn)分別為 right, left 。

方法一:遞歸法

根據(jù)二叉樹鏡像的定義,考慮遞歸遍歷(dfs)二叉樹,交換每個(gè)節(jié)點(diǎn)的左 / 右子節(jié)點(diǎn),即可生成二叉樹的鏡像。

遞歸解析:

終止條件: 當(dāng)節(jié)點(diǎn) root為空時(shí)(即越過葉節(jié)點(diǎn)),則返回 null ;

遞推工作:

初始化節(jié)點(diǎn)tmp,用于暫存root的左子節(jié)點(diǎn); .

開啟遞歸右子節(jié)點(diǎn)mirrorTree(root.right),并將返回值作為root的左子節(jié)點(diǎn)。

開啟遞歸左子節(jié)點(diǎn)mirrorTree(tmp) ,并將返回值作為root的右子節(jié)點(diǎn)。

返回值:返回當(dāng)前節(jié)點(diǎn)root ;

“Q:為何需要暫存root的左子節(jié)點(diǎn)? A:在遞歸右子節(jié) 點(diǎn)“root.left = mirrorTree(root.right);"執(zhí)行完畢后,root.left 的值已經(jīng)發(fā)生改變,此時(shí)遞歸左子節(jié)點(diǎn)mirrorTree(root.left)則會(huì)出問題。

復(fù)雜度分析:

  • 時(shí)間復(fù)雜度0(N) : 其中N為二叉樹的節(jié)點(diǎn)數(shù)量,建立二叉樹鏡像需要遍歷樹的所有節(jié)點(diǎn),占用O(N)時(shí)間。
  • 空間復(fù)雜度O(N): 最差情況下(當(dāng)二叉樹退化為鏈表),遞歸時(shí)系統(tǒng)需使用O(N)大小的??臻g。
  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.  * @微信公眾號(hào) 程序員千羽 
  8.  * @個(gè)人網(wǎng)站 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.      * 解法一:遞歸,時(shí)間復(fù)雜度:O(n),空間復(fù)雜度: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.  

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

利用棧(或隊(duì)列)遍歷樹的所有節(jié)點(diǎn)node,并交換每個(gè)node的左/右子節(jié)點(diǎn)。

算法流程:

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

復(fù)雜度分析:

  • 時(shí)間復(fù)雜度0(N) :其中N為二叉樹的節(jié)點(diǎn)數(shù)量,建立二叉樹鏡像需要遍歷樹的所有節(jié)點(diǎn),占用O(N)時(shí)間。
  • 空間復(fù)雜度O(N) :如下圖所示,最差情況下,棧stack最多同時(shí)存儲(chǔ)N+1/2個(gè)節(jié)點(diǎ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.  * @微信公眾號(hào) 程序員千羽 
  8.  * @個(gè)人網(wǎng)站 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.      * 解法二:迭代,時(shí)間復(fù)雜度:O(n),空間復(fù)雜度: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-

 

責(zé)任編輯:武曉燕 來源: 程序員千羽
相關(guān)推薦

2021-12-17 14:26:58

二叉樹節(jié)點(diǎn)數(shù)量

2022-07-27 07:45:53

二叉樹鏡像函數(shù)

2020-04-27 07:05:58

二叉樹左子樹右子樹

2021-05-06 17:46:30

二叉樹數(shù)據(jù)結(jié)構(gòu)

2021-04-19 07:47:42

數(shù)據(jù)結(jié)構(gòu)二叉樹Tree

2021-04-20 08:37:14

數(shù)據(jù)結(jié)構(gòu)二叉樹

2021-04-28 20:12:27

數(shù)據(jù)結(jié)構(gòu)創(chuàng)建

2022-10-26 23:58:02

二叉樹數(shù)組算法

2021-03-17 08:19:22

二叉樹LeetCode

2013-07-15 16:35:55

二叉樹迭代器

2021-08-27 11:36:44

二叉樹回溯節(jié)點(diǎn)

2021-09-29 10:19:00

算法平衡二叉樹

2020-09-23 18:25:40

算法二叉樹多叉樹

2022-11-06 19:43:10

二叉樹指針節(jié)點(diǎn)

2018-03-15 08:31:57

二叉樹存儲(chǔ)結(jié)構(gòu)

2021-12-05 18:25:12

二叉樹路徑節(jié)點(diǎn)

2021-09-15 07:56:32

二叉樹層次遍歷

2021-10-12 09:25:11

二叉樹樹形結(jié)構(gòu)

2022-10-12 23:25:17

二叉樹父節(jié)點(diǎn)根節(jié)點(diǎn)

2021-03-22 08:23:29

LeetCode二叉樹節(jié)點(diǎn)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)