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);
}
}