【劍指offer較難部分6】樹的子結構(java)
阿新 • • 發佈:2021-01-09
技術標籤:劍指offer(java)java二叉樹演算法資料結構
題目描述
輸入兩棵二叉樹A,B,判斷B是不是A的子結構。(ps:我們約定空樹不是任意一個樹的子結構)
分析
思路:
1、層次遍歷root1, 找到與root2相同的節點
2、相同結點找到後判斷以此節點為根節點,是否能在root1中找到與root2相同的樹結構
實現程式碼如下:
import java.util.Queue;
import java.util.LinkedList;
public class Solution {
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
if(root1 == null || root2 == null){
return false; //空樹不是任意一個樹的子結構,兩棵樹的根節點均不空
}
//第一步、在root1中找到與root2根節點相同的結點,用層次遍歷
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root1);
TreeNode cur;
while(!queue.isEmpty() ){
int size = queue.size();
for(int i = 0 ; i < size ; i++){
cur = queue.poll(); //出隊,cur接收出隊結點
//找到與根節點root2相同的結點
if(cur.val == root2.val){
//判斷子結構是否相等
if(isHasSubtreeHelper(cur, root2)){
return true;
}
}
if(cur.left != null){
queue.offer(cur.left);
}
if(cur.right != null){
queue.offer(cur.right);
}
}
}
return false;
}
//第二步:判斷子結構是否相同
public boolean isHasSubtreeHelper(TreeNode root1, TreeNode root2) {
if (root2 == null) {
return true; //1、root2為空,說明root2遍歷完畢,則返回true
}
if (root1 == null) {
return false; //2、root1為空,root2不為空,root1遍歷完畢,root2還沒有遍歷完,返回false
}
if (root1.val != root2.val) {
return false; //3、兩者都不為空,值不同,返回false
}
return isHasSubtreeHelper(root1.left, root2.left) && isHasSubtreeHelper(root1.right, root2.right);
}
}