1题目描述:
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
2.解题思路
要查找树A中是否存在和树B结构一样的子树,我们可以分为两步:第一步,在树A中找到和树B的根结点值一样的结点R;第二步,判断树A中以R为根结点的子树是不是包含和树B一样的结构。
对于这两步,第一步实际上就是树的遍历,第二步是判断是否有相同的结构,这两步都可以通过递归来实现。
以上面为例,先在A中找到值为8的节点,接着判断树A的根节点下面的子树是不是含有和树B一样的结构。在A中根节点的左子节点为8,而树B的根节点的左子节点为9,对应两个节点不同。
接着找8的节点,在A中第二层找到,然后进行第二步的判断(判断这个节点下面的子树是否含有树B一样的结构)
3.编程实现(Java):
public class HasSubtree_46 {
public boolean HasSubtree(TreeNode root1, TreeNode root2) {
boolean res = false;
if (root1 == null || root2 == null)
return false;
//如果找到了对应root2的根节点的点,以这个根节点为为起点判断是否包含root2
if (root1.val == root2.val)
res = doesTree1HasTree2(root1, root2);
//如果找不到,那么就再去root1的左儿子当作起点,去判断时候包含root2
if (!res)
res = doesTree1HasTree2(root1.left, root2);
//如果还找不到,那么就再去root1的右儿子当作起点,去判断时候包含root2
if (!res)
res = doesTree1HasTree2(root1.right, root2);
return res;
}
public boolean doesTree1HasTree2(TreeNode root1, TreeNode root2) {
//如果root2已经遍历完了都能对应的上,返回true
if (root2 == null)
return true;
//如果root2还没有遍历完,root1却遍历完了。返回false
if (root1 == null)
return false;
//如果其中有一个点没有对应上,返回false
if (root1.val != root2.val)
return false;
//如果根节点对应的上,那么就分别去子节点里面匹配
return doesTree1HasTree2(root1.left, root2.left)
&& doesTree1HasTree2(root1.right, root2.right);
}
}