package cn.dzp.flyroc.offer; public class HasSubTreeDemo { /* 題目描述:輸入兩顆二叉樹A,B。 判斷B是否是A的子結構。(約定空樹不是任何一個樹的子結構)*/ /* 思路:若根節點相同,利用遞歸比較他們的子樹是否相同; 若根節點不一樣,則利用遞歸分別在左右子樹中查找。*/ //代碼實現 static class TreeNode { //構建TreeNode類 int val; //節點值 TreeNode left; //構建左子樹 TreeNode right; //構建右子樹 //構造函數 TreeNode(int val) { this.val = val; } } //判斷A,B兩樹的根節點是否相同 public boolean rootEquire(TreeNode rootA, TreeNode rootB){ //定義一個初始標記 boolean result = false; //判斷A,B兩樹是否爲空 if (rootA != null && rootB != null){ //判斷A,B兩樹的根節點值是否相等 if (rootA.val == rootB.val){ //以A樹的根節點爲起點,與B樹一一比較 result = nodeEquire(rootA,rootB); } //若是A,B兩樹的根節點不一樣,就去A樹的左右子樹找是否有與B樹相同的結構 if (!result){ return rootEquire(rootA.left ,rootB) || rootEquire(rootA.left ,rootB); } } System.out.println("B樹不是A樹的子樹"); return result; } //判斷A,B兩樹的子樹是否相同 public static boolean nodeEquire(TreeNode nodeA, TreeNode nodeB) { //treeB全度遍歷完了,且一一對應 if (nodeB == null){ System.out.println("B數是A數的子樹"); return true; } //treeA全都遍歷完,treeB還沒遍歷完 if (nodeA == null){ System.out.println("B樹不是A樹的子樹"); return false; } //若是某處的節點值不一樣 if (nodeA.val != nodeB.val){ System.out.println("B樹不是A樹的子樹"); return false; } //若是根節點對應上,就去子樹中匹配 return nodeEquire(nodeA.left,nodeB.left) && nodeEquire(nodeA.right, nodeB.right); } }