思路:1、我们判断B树是否是以A树当前结点为顶点的子树,如果是则返回true;2、否则说明当前A树所在的节点不是B树的顶点,我们可以使用前序遍历找到B树在A树上面的顶点,然后在去判断其子结构。
当我们找到B树在A树上的顶点以后进入判断子结构函数,我们需要判断的左子树和右子树也是子结构就需要使用递归,当B树为空的时候说明前面的所有情况都相等,此时就是递归的出口,当B树为空,A树不为空时,此时B树一定不是A树的子结构。
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
if(root1 == null || root2 == null) return false;
return dfs(root1, root2) || HasSubtree(root1.left, root2) || HasSubtree(root1.right, root2);
}
public boolean dfs(TreeNode root1,TreeNode root2) { //判断子结构
if(root2 == null) return true;
if(root1 == null) return false;
if(root1.val != root2.val) return false;
return dfs(root1.left, root2.left) && dfs(root1.right, root2.right);
}
} 
京公网安备 11010502036488号