题目:输入两棵二叉树A和B,判断B是不是A的子结构,二叉树结构定义如下:
class TreeNode{
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val){
this.val = val;
}
}
直接上代码
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public static boolean HasSubtree(TreeNode root1,TreeNode root2) {
boolean result = false;
if(root2==null) //如果root2不存在,直接返回false
return false;
if(root1==null)
return false;
if(root1.val == root2.val) {
result = isHaveTreeNode(root1,root2); //当它们的头节点相同时,开始进行比较
}
if(!result) {
result = HasSubtree(root1.left, root2); //递归来寻找与root2相同的头节点
}
if(!result) {
result = HasSubtree(root1.right, root2);//递归来寻找与root2相同的头节点
}
return result;
}
private static boolean isHaveTreeNode(TreeNode root1, TreeNode root2) {
if(root2==null)
return true;
if(root1==null)
return false;
if(root1.val!=root2.val) //如果不相同,返回false;
return false;
return isHaveTreeNode(root1.left, root2.left)&&isHaveTreeNode(root1.right, root2.right); //如果root1.val==root2.val 接下来判断它们的左右子节点是否相同
}
}
思路分析;
1)首先我们要在A中找到和B头节点相同的节点,然后开始比较。针对二叉树,我们可以使用递归的方式来进行遍历每一个节点。
2)在比较的过程中,我们先进行值的比较,如果不同直接返回false,相同的话进一步利用递归比较它们的左右子节点。
在递归中,我们结束递归的标志是分为root2是否为null和root1是否为null;
如果root2为null,那么证明root1之中是包含root2的。