刚才看到了这道题目,第一时间的想法是比较节点,假设A的某一结点a和B的某一结点b相同,那么就可以进行接下来a节点和b节点的左孩子及其子节点还有右孩子及其子节点的比较,必选完全相同才可以,这样下来时一个递归函数。后来想到了遍历,将两棵树的所有节点都遍历出来,存进一个字符串中,再查看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) {
if(root2==null){
return false;
}
StringBuilder strBuilder=new StringBuilder();
StringBuilder strrBuilder=new StringBuilder();
preOrderRecur(root1,strBuilder);
preOrderRecur(root2,strrBuilder);
if(strBuilder.toString().indexOf(strrBuilder.toString())!=-1){
return true;
}else{
return false;
}
}
public void preOrderRecur(TreeNode head,StringBuilder stringBuilder) {
if (head == null) {
return;
}
stringBuilder.append(head.val);
preOrderRecur(head.left,stringBuilder);
preOrderRecur(head.right,stringBuilder);
}
}
优点就是可以降低时间复杂度!!!