先说思路,判断相同子结构,肯定要用得到回溯或递归,先判断两棵树的根节点值是否相等,一直查找,是否根节点具有相同的子节点,并且子节点的值是否相等。
若B是A的子树,则1、依次遍历树A的每个节点nodeA ;2、判断以nodeA节点为根节点的子树是否包含树B。
深度优先搜索dfs(helper()函数): 1、dfs起点:从根节点作为起点开始搜索树A和B的节点;2、递归出口:(1)如果B先深度优先搜索完,则说明B之前所有节点都与A匹配,直接return true;(2)如果A先深度优先搜索完,则说明B比A有多出来的节点,即A,B不匹配,直接return false;3、中途结束条件:(1)如果A或B节点值不相等,直接返回false;(2)A和B的节点值相等,继续对A和B的左子树和右子树进行遍历;
isSubStructure()方法:如果以节点A和节点B为根节点的树经过dfs(help()函数)匹配成功,直接返回true;否则,再次从A的左子树或右子树对B进行匹配。
时间复杂度:最坏情况,遍历A和B的所有节点m和n,O(mn)
空间复杂度:最坏情况,遍历完A,完成匹配或不匹配,O(m)
class Solution {
public boolean isSubStructure(TreeNode A, TreeNode B) {
if(A==null || B==null){
return false;
}
//节点A的值等于节点B的值 且 节点A的左子结构等于节点B的左子结构 且 节点A的右子结构等于B的右子结构
//if(A.val == B.val && (helper(A.left,B.left) && helper(A.right,B.right))){
if(helper(A,B)) {
return true;
}
//节点A的值不等于节点B的值 查找A的左子结构和B是否相等 查找A的右子结构和B是否相等
return isSubStructure(A.left,B) || isSubStructure(A.right,B);
}
public boolean helper(TreeNode root1, TreeNode root2){
if(root2 == null) { //如果root2没有子结构 则为真
return true;
}
if(root1 == null && root2 != null) { //如果root1没有子结构但root2有子结构 则为假
return false;
}
if(root1.val == root2.val){ //如果root1和root2的值相等 则再去寻找root1和root2的左子节点和右子节点
return helper(root1.left, root2.left) && helper(root1.right, root2.right);
}else{
return false;
}
}
}