题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
分析
查找A中是否存在树B结构一样的子树,可以分为两步:
第一步,在树A中找到和树B的根节点的值一样的节点R
第二步,判断A中以R为根节点的子树是不是包含和树B一样的结构
以上面为例,先在A中找到值为8的节点,接着判断树A的根节点下面的子树是不是含有和树B一样的结构。在A中根节点的左子节点为8,而树B的根节点的左子节点为9,对应两个节点不同。
接着找8的节点,在A中第二层找到,然后进行第二步的判断(判断这个节点下面的子树是否含有树B一样的结构)
代码
第一步
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
boolean result = false;
//当root1和root2都不为null的时候,才进行比较。否则直接返回false
if(root1 != null && root2 != null) {
//如果找到了对应root2的根节点的点
if(root1.val == root2.val) {
//以这个根节点为为起点判断是否包含root2
result = DoesTreeHaveTree2(root1, root2);
}
if(!result) {
//如果找不到,那么就再去root1的左儿子当作起点,去判断时候包含root2
result = HasSubtree(root1.left, root2);
}
if(!result) {
//如果还找不到,那么就再去root1的右儿子当作起点,去判断时候包含root2
result = HasSubtree(root1.right, root2);
}
}
return result;
}
第二步
public boolean DoesTreeHaveTree2(TreeNode node1, TreeNode node2) {
//如果node2已经遍历完了都能对应的上,返回true
if(node2 == null) {
return true;
}
//如果node2还没有遍历完,node1却遍历完了。返回false
if(node1 == null) {
return false;
}
//如果其中有一个点没有对应上,返回false
if(node1.val != node2.val) {
return false;
}
//如果根节点对应的上,那么就分别去子节点里面匹配
return DoesTreeHaveTree2(node1.left, node2.left) && DoesTreeHaveTree2(node1.right, node2.right);
}