思路:
1. 在树A中查找和根结点的值一样的结点.如果发现某一结点的值和树B的头结点的值相同,则进行第二步判断.
第二步:
2. 判断树A中以R为根结点的子树是不是和树B具有相同的结构.即如果结点R的值和树B的根节点不相同,则以R
为根节点的子树和树B肯定不是具有相同的结点;如果它们的值相同,则递归的判断它们各自的左右结点的值是不
是相同。
public boolean HasSubtree(TreeNode root1, TreeNode root2)
{
boolean flag = false; // 设置标志位flag,默认为false
if (root1 != null && root2 != null)
{
if (root1.val == root2.val) // 如果根结点的值相同,就继续判断
{
flag = DoesTree1HaveTree2(root1, root2);
}
// 比较树A左子树结点和树B根结点的值
if (!flag)
flag = HasSubtree(root1.left, root2);
// 比较树A右子树结点和树B根结点的值
if (!flag)
flag = HasSubtree(root1.right, root2);
}
return flag;
}
private boolean DoesTree1HaveTree2(TreeNode root1, TreeNode root2)
{
// 树Ak到达叶节点,而树B没有到达时
if (root1 == null && root2 != null)
return false;
// 树B到达叶节点时
if (root2 == null)
return true;
// 树A中结点的值和树B中结点值不相等时
if (root1.val != root2.val)
return false;
// 继续比较树A和树B的左子树和右子树的情况
return DoesTree1HaveTree2(root1.left, root2.left)
&& DoesTree1HaveTree2(root1.right, root2.right);
}