/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
//分为两个函数,一个用于遍历节点当做子树的根节点,另一个用于判断是否是子树(必须要root2先空)
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
if(root1==null||root2==null)
return false;
//此处用到一个技巧,直接判断isSubtree(root1,root2),并且采取||的方式确定结果。
return isSubtree(root1,root2)||HasSubtree(root1.left,root2)||HasSubtree(root1.right,root2);
}
public boolean isSubtree(TreeNode root1,TreeNode root2){
if(root2==null)
return true;
if(root1==null)
return false;
if(root1.val==root2.val)
return isSubtree(root1.left,root2.left)&&
isSubtree(root1.right,root2.right);
else{
return false;
}
}
}
思路很巧妙,代码简介了不少,但还是要多练习,
做了2、3遍了还是会忘记一些判断手法。
共勉。
9.21:用到了两次递归,一个是HasSubtree,一个是isSubTree。