思路:
按着根节点向下逐个比较,如果A树走到头还没有和B相等的子结构就返回false,没有就继续进行A的左子树遍历,A的左子树要进行和之前差不多的操作,不过要和B的左子树进行比较,右子树同理,只要有一个不相同就返回之前的节点向下继续遍历查找。如果B子树能查找直到null,说明B是A的子结构。
实现:
/**
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(root2!=null && root1!=null){//判断是否到空,有一个为空就停止
if(root1.val==root2.val){//判断根节点的值是否相同,相同则继续
result=Tree1HaveTree2(root1,root2);//从此节点向下继续判断
}
if(!result){//不同的话就看左子树
result=HasSubtree(root1.left,root2);
}
if(!result){//还不同看右子树
result=HasSubtree(root1.right,root2);
}
}
return result;
}
public boolean Tree1HaveTree2(TreeNode node1,TreeNode node2){
if(node2==null){//node2遍历完说明都包含,返回true
return true;
}
if(node1==null){//node1都能遍历完了说明不含node2,返回false
return false;
}
if(node1.val != node2.val){//node1的值和node2不同,返回false
return false;
}
return Tree1HaveTree2(node1.left,node2.left) && Tree1HaveTree2(node1.right,node2.right);
//同时比较node1的左子树和node2的左子树,和node1的右子树和node2的右子树
}
}