题目:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
思路:先遍历树A,如果找到与树B值相同的节点,则判断以该节点为根的树是否包含树B。包含的判断依据是,按相同的顺序递归两棵树,若发现有不同的值则不包含,若树A先递归完则不包含,若树B先递归完则包含。
/**
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) {
boolean result = false;//返回结果
if(root1!=null&&root2!=null){//如果有一棵树为空则直接包含关系不成立
if(root1.val == root2.val){//当找到相等的根节点时,执行判断子树的方法,参数是两个根节点。
result = checkSubTree(root1,root2);
}
//递归树A
result = result||HasSubtree(root1.left,root2);
result = result||HasSubtree(root1.right,root2);
}
return result;
}
public boolean checkSubTree(TreeNode root1,TreeNode root2){
if(root2 == null){//当树B所有的节点都判断完毕而没有返回false,则代表包含子树,返回true。
return true;
}
if(root1 == null){//如果树A先递归完,则包含关系不成立。
return false;
}
if(root1.val!=root2.val){//如果出现不等的节点,则包含关系不成立。
return false;
}
//递归判断,巧用&&
return checkSubTree(root1.left,root2.left)&&checkSubTree(root1.right,root2.right);
}
}