树的子结构(剑指offer)
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
解法:通过两个函数实现,一个函数1进行判断A、B根节点是否相同,另一个函数2则判断A、B子节点是否仍然相同。
具体做法:函数1先判断头节点是否相同,相同执行函数2来判断子节点。若根节点不同或子节点不同,则将B根节点与A的左右子节点判断来继续寻找。 函数2中的具体操作就是,若A为空false,如果两个子节点的值不同直接返回false,否则相同的话进行递归返回该子节点的左右子节点的函数2判断,直到B子节点为空则代表找到了返回true
public class Solution {
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
boolean result = false;
if(root1!=null && root2!=null){
if(root1.val==root2.val){
result = HasSubtree2(root1,root2);
}
if(!result){
result = HasSubtree(root1.left,root2);
}
if(!result){
result = HasSubtree(root1.right,root2);
}
}
return result;
}
public boolean HasSubtree2(TreeNode root1,TreeNode root2){
if(root2==null){
return true;
}
if(root1==null){
return false;
}
if(root1.val!=root2.val){
return false;
}
return HasSubtree2(root1.left,root2.left)&&HasSubtree2(root1.right,root2.right);
}
}