题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
注意的问题
把每个函数的作用弄清楚:
- HasSubtree(TreeNode root1,TreeNode root2):以root2为根的树是否可以是以root1为根的树的子结构。当root1和root2都不为空时,若root1.val != root2.val,此时root2的树如果能是root1的子结构,必然有两种情况:①以root2为根的树是以root1.left为根的树的子结构。②以root2为根的树是以root1.right为根的树的子结构。否则,有三种情况:①以root2为根的树是以root1为根的树的子结构,且root2的位置与root1重合。②以root2为根的树是以root1.left为根的树的子结构。③以root2为根的树是以root1.right为根的树的子结构。
- check(TreeNode node1, TreeNode node2):node2以及其下面的节点能否与node1重合,即以node2为根的树是否可以是以node1为根的树的子结构,且node2必须在node1的位置上。
代码
/**
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(root2 == null){
return false;
}
if(root1 == null){
return false;
}
//root1不能与root2重合
if(root1.val != root2.val){
//向下搜索:root2可能与root1.left或root1.right重合
return HasSubtree(root1.left,root2) || HasSubtree(root1.right, root2);
}else{//root1可能与root2重合
//判断root1是否能与root2重合
//也有可能是root2与root1.left或root1,right重合
return check(root1, root2) || HasSubtree(root1.left,root2) || HasSubtree(root1.right, root2);
}
}
//检查以node1为根节点的t1是否包含以node2为根节点的t2,node1必须与node2重合
private boolean check(TreeNode node1, TreeNode node2){
if(node2 == null){
return true;
}
if(node1 == null){
return false;
}
if(node1.val != node2.val){
return false;
}
return check(node1.left, node2.left) && check(node1.right, node2.right);
}
}