判斷一顆二叉樹是不是另外一顆的子結構


這是一道比較經典的題目。我先是在百度的在線筆試中遇到,然后發現劍指Offer上有原題。當然題目並不完全一樣不過大致相同。

百度筆試是給你兩個根節點判斷第棵樹是不是第一棵樹的子樹。劍指Offer是問你第二顆數是不是第一棵樹的子結構(也就是說可是是第一棵二叉樹的中間階段)。

 

筆試的時候恁是沒完全通過測試案例,就差幾個,實在也是不知道是什么問題。這次劍指Offer的在線測試中,發現他的描述不是很准確。我一開始以為空樹是任何樹的子結構,結果空樹不是任何數的子結構。

第一版代碼:算法復雜度是O(M * N) ;M是第一棵樹的元素個數,N是第二顆樹的元素個數。

 1 /**
 2 public class TreeNode {
 3     int val = 0;
 4     TreeNode left = null;
 5     TreeNode right = null;
 6 
 7     public TreeNode(int val) {
 8         this.val = val;
 9 
10     }
11 
12 }
13 */
14 public class Solution {
15     public boolean HasSubtree(TreeNode root1,TreeNode root2) {
16         
17         if(root2 == null)
18             return false;
19         
20         return DFS(root1, root2);
21     }
22     
23     private boolean DFS(TreeNode root1, TreeNode root2) {
24         
25           if(root1 == null)
26             return false;
27         
28         if(IsSubTree(root1, root2))
29             return true;
30         
31         return HasSubtree(root1.left, root2) | HasSubtree(root1.right, root2);  
32     }
33     
34     private boolean IsSubTree(TreeNode root1, TreeNode root2) {
35         
36         if(root2 == null)
37             return true;
38         else {
39             if(root1 == null || root1.val != root2.val)
40                 return false;
41             return IsSubTree(root1.left, root2.left) & IsSubTree(root1.right, root2.right);
42         }
43         
44     }
45 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM