思路:递归法求解根节点是否值一致,不一致则求左右子树是否有子结构。分为两种情况讨论,1:初始根节点与要求节点的根节点一致,比较两棵树的左右子树。这种情况还需分两种情况,(1)即左右子树不一致,该情形下需要将初始根节点的左右子树匹配要求子树,递归初始根节点与要求节点的两种情形;(2)能够匹配到子结构,则输出true。2:初始根节点与要求节点值不一致,则直接递归调用初始根节点的左右子树与要求节点的匹配。
代码:
/**
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;
boolean leftFlag = false;
boolean rightFlag = false;
if(root2 == null){
return false;
}
if(root1 == null){
return false;
}
if(root1.val == root2.val){
if(root1.left != null){
if(root2.left == null){
leftFlag = true;
}else{
leftFlag = HasSubtree(root1.left,root2.left);
}
}else{
if(root2.left == null){
leftFlag = true;
}
}
if(root1.right != null){
if(root2.right == null){
rightFlag = true;
}else{
rightFlag = HasSubtree(root1.right,root2.right);
}
}else{
if(root2.right == null){
rightFlag = true;
}
}
if(leftFlag && rightFlag){
result = true;
}
if(!result){
if(root1.left != null){
leftFlag = HasSubtree(root1.left,root2);
}else{
leftFlag = false;
}
if(root1.right != null){
rightFlag = HasSubtree(root1.right,root2);
}else{
rightFlag = false;
}
result = leftFlag || rightFlag;
}
}else{
if(root1.left != null){
leftFlag = HasSubtree(root1.left,root2);
}else{
leftFlag = false;
}
if(root1.right != null){
rightFlag = HasSubtree(root1.right,root2);
}else{
rightFlag = false;
}
if(leftFlag || rightFlag){
result = true;
}
}
return result;
}
}
end