输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
解析:
子树:是指左或右子树,子树必须是包含原树的某一最底层的树;
子结构:原树的一部分即可;
是否包含子结构,分两步:①遍历树,查看是否包括子结构的根节点
②如果包含,从该节点开始对比,是否一样,如果一样返回true;细节解析见代码
代码:
/**
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(root1 == null || root2 == null){
return false;
}
if(root1.val == root2.val){
if(judge(root1,root2)) //如果直接相同,则直接返回true;
return true; //如果不同继续遍历
//不可直接使用return judge(roo1,root2) 可能会造成未遍历直接返回
}
return HasSubtree(root1.left,root2) || HasSubtree(root1.right,root2);
}
public boolean judge(TreeNode r1, TreeNode r2){
if(r2 == null){
return true;
}
if(r1 == null){
return false;
}
if(r1.val == r2.val){
return judge(r1.left,r2.left) && judge(r1.right,r2.right);
}
return false;
}
}