AcWing打卡活動
《劍指Offer》打卡活動
週三第三題 樹的子結構
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*
* 思路
* 從樹A的根節點開始遍歷
* 先序遍歷的順序遍歷樹A和樹B
*
*/
class Solution {
public boolean hasSubtree(TreeNode pRoot1, TreeNode pRoot2) {
Boolean result = false;
if(pRoot1 != null && pRoot2 != null) {
// 如果根節點相等,則遍歷左右子節點
if(pRoot1.val == pRoot2.val) {
result = doesTree1HaveTree2(pRoot1, pRoot2);
}
// 遞歸遍歷樹A的左子節點
if(!result) {
result = hasSubtree(pRoot1.left, pRoot2);
}
// 遞歸遍歷樹b的右子節點
if(!result) {
result = hasSubtree(pRoot1.right, pRoot2);
}
}
return result;
}
public boolean doesTree1HaveTree2(TreeNode pRoot1, TreeNode pRoot2) {
// 如果樹B先遍歷完,則是子結構
if(pRoot2 == null) {
return true;
}
// 如果樹B沒有遍歷完,而樹A已經遍歷完了,則不是子結構
if(pRoot1 == null) {
return false;
}
if(pRoot1.val != pRoot2.val) {
return false;
}
// 遞歸遍歷左子節點和右子節點
return doesTree1HaveTree2(pRoot1.left, pRoot2.left) && doesTree1HaveTree2(pRoot1.right, pRoot2.right);
}
}