这道题是剑指offer题库中一道题,网上大都是C/C++的写法,不过算法最重要的是思想。
判断B是否为A的子结构分两步:
1.在A中找到和B的根结点值一样的结点R
2.判断A中以R为根结点的子树是不是包含和B树一样的结构
注意:定义空树不是任何树的子树,空树也不包含任何子树
java代码如下:
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(root1!=null&&root2!=null){
if(root1.val==root2.val){
result=DoesTreeAHaveTreeB(root1,root2);
}
if(result==false){
result=HasSubtree(root1.left,root2);
}
if(result==false){
result=HasSubtree(root1.right,root2);
}
}
return result;
}
public boolean DoesTreeAHaveTreeB(TreeNode root1,TreeNode root2){
if(root2==null)return true;
if(root1==null)return false;
if(root1.val!=root2.val)return false;
return DoesTreeAHaveTreeB(root1.left,root2.left)&&DoesTreeAHaveTreeB(root1.right,root2.right);
}
} 注意空树情况,以及各种边界判断,程序用递归写的,比较容易理解。树尤其是二叉树是非常重要的存储结构,同时衍生出很多特殊结构,用于解决生活中的实际问题,希望在不断的学习练习中熟练掌握,灵活应用,更好的解决问题。