劍指offer_17:樹的子結構
阿新 • • 發佈:2020-12-05
輸入兩棵二叉樹A和B,判斷B是不是A的子結構。(約定空樹不是任意一個樹的子結構)
B是A的子結構, 即 A中有出現和B相同的結構和節點值。
例如:
給定的樹 A:
給定的樹 B:
返回 true,因為 B 與 A 的一個子樹擁有相同的結構和節點值。
示例 1:
輸入:A = [1,2,3], B = [3,1]
輸出:false
示例 2:
輸入:A = [3,4,5,1,2], B = [4,1]
輸出:true
限制:
0 <= 節點個數 <= 10000
1、遞迴
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public boolean isSubStructure(TreeNode A, TreeNode B) { //特殊情況 if(A==null||B==null){ return false; } //A、B結點相等就開始比較子樹是否相等 if(A.val==B.val&&helper(A.left,B.left)&&helper(A.right,B.right)){ return true; } //掃描A直到找到和B相等的點 return isSubStructure(A.left,B)||isSubStructure(A.right,B); } public boolean helper(TreeNode A,TreeNode B){ //B為空則結束 if(B==null) return true; //A為空則無法匹配 if(A==null) return false; //比較A和B的子樹 if(A.val==B.val){ return helper(A.left,B.left)&&helper(A.right,B.right); } return false; } }
2、廣度優先搜尋
因為要遍歷二叉樹,用深搜的遞迴、非遞迴,或者廣搜都是可以的
但是用廣搜會超時
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public boolean isSubStructure(TreeNode A, TreeNode B) { if(A==null||B==null){ return false; } Queue<TreeNode> list=new LinkedList<>(); list.offer(A); while(!list.isEmpty()){ TreeNode node=list.poll(); if(bfs(node,B)){ return true; } if(node.left!=null){ list.offer(node.left); } if(node.right!=null){ list.offer(node.right); } } return false; } public boolean bfs(TreeNode node,TreeNode B){ Queue<TreeNode> queueA=new LinkedList<>(); queueA.offer(node); Queue<TreeNode> queueB=new LinkedList<>(); queueB.offer(B); while(!queueA.isEmpty()&&!queueB.isEmpty()){ TreeNode nodeA=queueA.poll(); TreeNode nodeB=queueB.poll(); if(nodeA==null&&nodeB!=null){ return false;//A走完,B未走完,必定無法比配 } if(nodeB==null){ continue;//該B結點為空,但同一層可能還有非空的B結點 } if(nodeA.val!=nodeB.val){ return false; } queueA.offer(node.left); queueA.offer(node.right); queueB.offer(B.left); queueB.offer(B.right); } return true; } }