题目:输入两棵二叉树A和B,判断B是不是A的子结构(约定空树不是任何一棵树的子结构)。
要查找树A中是否存在和树B结构一样的子树,可以分为2步来考虑:第一步,对树A进行层序遍历,在树A中找到和树B中的根结点的值相等的结点N;第二步,如果在树A中找到了和树B中的根结点的值相等的结点N,则继续判断树A中以结点N为根结点的子树是否包含和树B一样的结构,即判断树A中以结点N为根节点的左子结点的值和右子结点的值是否分别与树B的左子结点的值和右子结点的值相等。
涉及二叉树的遍历(层序遍历:从上到下,同一层从左到右),最常用的方法就是递归和循环,考虑到递归的代码比较简练,因此这里使用递归的方法去遍历二叉树。
同时,因为二叉树的问题常常涉及到比较复杂的指针操作,因此要非常注意对于指针为null的情况的判断和处理,因为当代码试图访问空指针指向的内存时,程序就会崩溃。在写遍历树的代码的时候一定要高度警惕,在每一处需要访问地址的时候都要问自己这个地址有没有可能是null,如果是null的话该怎么处理。
/*
public class TreeNode
{
int val = 0;//根结点的值
TreeNode left = null;//左子结点
TreeNode right = null;//右子结点
public TreeNode(int val)//构造函数
{
this.val = val;//this关键字用于区分成员变量和局部变量同名的情况
}
}
*/
public class Solution
{
public boolean HasSubtree(TreeNode root1,TreeNode root2)
{
boolean result = false;
//找到树A中与树B根结点的值相同的结点N
if(root1 != null && root2 != null)
{
if(root1.val == root2.val)
result = isSubTree(root1,root2);
if(!result)
result = HasSubtree(root1.left,root2);
if(!result)
result = HasSubtree(root1.right,root2);
}
return result;
}
public boolean isSubTree(TreeNode root1,TreeNode root2)
{
if(root2 == null)//说明此时已经到了树B的叶子结点
return true;
if(root1 == null)//说明此时已经到了树A的叶子结点但没有到树B的叶子结点
return false;
if(root1.val != root2.val)
return false;
return isSubTree(root1.left,root2.left) && isSubTree(root1.right,root2.right);
}
}