输入两棵二叉树A,B,判断B是不是A的子结构。(ps:约定空树不是任意一个树的子结构)
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
// 被调用函数
public boolean isSame(TreeNode root1, TreeNode root2){
if (root2 == null) return true;
if (root1 == null) return false;
if (root1.val != root2.val) return false;
return isSame(root1.left, root2.left) && isSame(root1.right, root2.right);
}
// 函数入口,传入两个二叉树root1和root2, 判断root2是否为root1的子结构
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
// 注意,题目说明了空树不是任何数的子结构
if (root2 == null || root1 == null) return false;
// 排除空树的情况下,来判断 root2 是否是 root1的子结构, 其中调用 isSame函数
if (root1.val == root2.val && isSame(root1, root2) == true) return true;
// 递归判断root1的左右子树中是否包含root2
return HasSubtree(root1.left, root2) || HasSubtree(root1.right, root2);
}
}
难点:
1, 排除空树的情况下,判断root2是否为root1的子结构,其中将要调用一个函数。 这个函数应该怎么实现?
看一下如下的分析:
// https://blog.nowcoder.net/n/db568d60c607489c99ca11fa803b7cfb?f=comment
public class Solution {
//遍历大树
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
if(root1 == null || root2 == null){
return false;
}
//如果找到与子树相同根的值,走判断方法
if(root1.val == root2.val){
if(judge(root1,root2)){
return true;
}
}
//遍历左孩子,右孩子
return HasSubtree(root1.left, root2) || HasSubtree(root1.right, root2);
}
//判断是否是子结构
public boolean judge(TreeNode root, TreeNode subtree) {
//子结构已经循环完毕,代表全部匹配
if(subtree == null){
return true;
}
//大树已经循环完毕,并未成功匹配
if(root == null){
return false;
}
//相等后判断左右孩子
if(root.val == subtree.val){
return judge(root.left, subtree.left) && judge(root.right, subtree.right);
}
return false;
}
}
Q: 为什么jugde循环之后,最后要返回False?
不满足条件,中途退出返回false。