题干
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
思路
求二叉树的子树和二叉树的镜像而言都是基本的二叉树的递归的调用,思考一下,判断一个二叉树是不是一个二叉树的子树,首先对于子树的二叉树的根节点要先行找到,然后判断对于主树的左右节点是否与子树的左右节点相等(是递归函数里面的判断)然后是递归结束的返回,对于主树来说,若是出现了空值表示对于子树有节点的地方没有对应的节点,是错误的情况。对于子树而言,出现了空值(主树还没出现空值)此时表示子树探索完毕,返回true。然后就是主函数里面的循环,对于主树要不断轮询左右节点,找到对应的根节点相同的值。
主要思想就是对于二叉树做题理解够深刻以后,在递归函数里面先判断一些跳出的情况,然后进行递归处理(具体的讲解在之前的博客里面有讲到关于二叉树的递归等)。
代码
public class Solution {
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
if(root1==null || root2==null)
return false;
return istrue(root1,root2)||HasSubtree(root1.left,root2) || HasSubtree(root1.right,root2);
}
private boolean istrue(TreeNode root1,TreeNode root2){
if(root2==null)
return true;
if(root1==null)
return false;
if(root1.val!=root2.val)
return false;
return istrue(root1.left,root2.left)&& istrue(root1.right,root2.right);
}
}