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

聊聊判斷二叉樹A中是否包含子樹B

開發 前端
輸入兩棵二叉樹A和B,判斷B是不是A的子結構。(約定空樹不是任意一個樹的子結構)B是A的子結構, 即 A中有出現和B相同的結構和節點值。

[[437107]]

Leetcode : https://leetcode-cn.com/problems/shu-de-zi-jie-gou-lcof

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

判斷二叉樹A中是否包含子樹B

“題目描述 :輸入兩棵二叉樹A和B,判斷B是不是A的子結構。(約定空樹不是任意一個樹的子結構)B是A的子結構, 即 A中有出現和B相同的結構和節點值。例如:給定的樹 A:

  1.        3 
  2.       / \ 
  3.     4   5 
  4.   / \ 
  5. 1   2 

給定的樹 B:

  1.  
  2.  

返回 true,因為 B 與 A 的一個子樹擁有相同的結構和節點值。示例 1:

  1. 輸入:A = [1,2,3], B = [3,1] 
  2.  
  3. 輸出:false 

示例 2:

  1. 輸入:A = [3,4,5,1,2], B = [4,1] 
  2.  
  3. 輸出:true 

限制:0 <= 節點個數 <= 10000

解題思路:若樹B是樹A的子結構,則子結構的根節點可能為樹A的任意一個節點。因此,判斷樹B是否是樹A的子結構,需完成以下兩步工作:

先序遍歷樹A中的每個節點nA ; (對應函數 isSubStructure(A, B) )

判斷樹A中以nA為根節點的子樹否包含樹B。(對應函數recur(A,B))

算法流程:

“名詞規定:樹 A 的根節點記作 節點 A ,樹 B 的根節點稱為 節點 B 。

recur(A, B) 函數:

1.終止條件:

  • 當節點 B為空:說明樹 B 已匹配完成(越過葉子節點),因此返回 true ;
  • 當節點 A為空:說明已經越過樹 A 葉子節點,即匹配失敗,返回 false ;
  • 當節點 A 和 B 的值不同:說明匹配失敗,返回 false ;

2.返回值:

  • 判斷A和B的左子節點是否相等,即recur(A. left, B. left) ;
  • 判斷A和B的右子節點是否相等,即recur(A. right,B. right) ;

isSubStructure(A, B)函數:

  • 特例處理 :當樹A為空或樹B為空時,直接返回false;
  • 返回值 :若樹B是樹A的子結構,則必滿足以下三種情況之一,因此用或|連接;
    • 以節點A為根節點的子樹包含樹B,對應recur(A,B);
    • 樹B是樹A左子樹的子結構,對應isSubStructure(A. left, B) ;
    • 樹B是樹A右子樹的子結構,對應isSubStructure(A. right, B) ;

以讓 2. 3.實質上是在對樹A做先序遍歷。

復雜度分析:

  • 時間復雜度O(MN): 中M,N分別為樹A和樹B的節點數量;先序遍歷樹A占用0(M),每次調用recur(A, B)判斷占用O(N)。
  • 空間復雜度O(M):
    • 當樹A和樹B都退化為鏈表時,遞歸調用深度最大。
    • 當M≤N時,遍歷樹A與遞歸判斷的總遞歸深度為M ;
    • 當M> N時,最差情況為遍歷至樹A葉子節點,此時總遞歸深度為M。
  1. package com.nateshao.sword_offer.topic_20_isSubStructure; 
  2.  
  3. /** 
  4.  * @date Created by 邵桐杰 on 2021/11/23 19:19 
  5.  * @微信公眾號 程序員千羽 
  6.  * @個人網站 www.nateshao.cn 
  7.  * @博客 https://nateshao.gitee.io 
  8.  * @GitHub https://github.com/nateshao 
  9.  * @Gitee https://gitee.com/nateshao 
  10.  * Description: 判斷二叉樹A中是否包含子樹B 
  11.  */ 
  12. class Solution { 
  13.  
  14.     /** 
  15.      * 精選解答 
  16.      * @param A 
  17.      * @param B 
  18.      * @return 
  19.      */ 
  20.     public static boolean isSubStructure1(TreeNode A, TreeNode B) { 
  21.         return (A != null && B != null) && (recur1(A, B) || isSubStructure1(A.left, B) || isSubStructure1(A.right, B)); 
  22.     } 
  23.  
  24.     public static boolean recur1(TreeNode A, TreeNode B) { 
  25.         if (B == nullreturn true
  26.         if (A == null || A.val != B.val) return false
  27.         return recur1(A.left, B.left) && recur1(A.right, B.right); 
  28.     } 
  29.      
  30.     /*********************************** 法二 *********************************************/ 
  31.     //遍歷A的每一個節點 
  32.     public boolean isSubStructure(TreeNode A, TreeNode B) { 
  33.         if (A == null || B == nullreturn false;//約定空樹不是任意一個樹的子結構 
  34.         return recur(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B); 
  35.     } 
  36.  
  37.     //同時遍歷A和B的相同位置節點 
  38.     boolean recur(TreeNode A, TreeNode B) { 
  39.         //當B某個節點為null,則無需比較了,直接返回true,比較其他節點 
  40.         if (B == nullreturn true
  41.         //如果相同位置的兩個節點不相同,則返回false,不用再繼續比較了 
  42.         if (A == null || A.val != B.val) return false
  43.         //繼續往下遍歷比較 
  44.         return recur(A.left, B.left) && recur(A.right, B.right); 
  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.     } 

 

參考鏈接:https://leetcode-cn.com/problems/shu-de-zi-jie-gou-lcof/solution/mian-shi-ti-26-shu-de-zi-jie-gou-xian-xu-bian-li-p

 

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

2021-10-12 09:25:11

二叉樹樹形結構

2020-04-27 07:05:58

二叉樹左子樹右子樹

2021-12-03 09:16:03

二叉樹打印平衡

2021-09-02 11:31:28

二叉搜索樹迭代法公共祖先

2021-09-29 10:19:00

算法平衡二叉樹

2023-02-01 07:27:46

序列化二叉樹根節點

2013-07-15 16:35:55

二叉樹迭代器

2021-03-17 08:19:22

二叉樹LeetCode

2021-04-19 07:47:42

數據結構二叉樹Tree

2021-04-20 08:37:14

數據結構二叉樹

2020-09-23 18:25:40

算法二叉樹多叉樹

2020-11-25 08:25:02

二叉樹節點

2021-04-28 20:12:27

數據結構創建

2021-08-26 11:31:11

二叉樹數據結構算法

2020-12-22 08:56:51

JavaScript數據結構前端

2021-08-27 11:36:44

二叉樹回溯節點

2021-03-22 08:23:29

LeetCode二叉樹節點

2023-05-08 15:57:16

二叉樹數據結構

2022-10-26 23:58:02

二叉樹數組算法

2021-05-06 17:46:30

二叉樹數據結構
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩中文字幕在线观看 | 国产亚洲一区在线 | 中文字幕视频三区 | 高清av一区 | 在线视频国产一区 | 久久久久久久久精 | 狠狠干天天干 | 日韩精品在线看 | 最新午夜综合福利视频 | 久久久久久久久一区 | 特级黄色毛片 | 国产福利在线看 | 欧美成人一区二区 | 欧美精品一区二区在线观看 | 欧美一级做性受免费大片免费 | 99热精品在线 | 四虎成人精品永久免费av九九 | www.久久久久久久久 | 成人中文字幕av | 久久9精品 | 欧美国产精品一区二区三区 | 人人干人人干人人干 | 久热精品在线 | 成人特级毛片 | 日韩精品视频中文字幕 | 国产精品国产三级国产aⅴ入口 | 欧美色综合 | 欧美日韩免费一区二区三区 | 一区二区小视频 | 黄网免费看 | 亚洲视频在线观看免费 | 精品国产乱码久久久久久88av | 伊人精品在线视频 | 成人h电影在线观看 | 武道仙尊动漫在线观看 | 午夜精品久久久 | 成人精品鲁一区一区二区 | 欧美黄色免费网站 | 完全免费在线视频 | 九九热精品视频 | 精品96久久久久久中文字幕无 |