题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
测试用例:
{8,8,7,9,3,#,#,#,#,4,7},{8,9,2}
对应输出应该为:
false
分析:
判断两棵树,如果彼此根节点不相同,则判断tree1的左子树和tree2是否相同,
再判断右子树和tree2是否相同,如果有一点没有满足就返回false
注意null的条件,HasSubTree中,如果两棵树都不为空才进行判断,
isSubTree中,如果Tree2为空,则说明第二棵树遍历完了,即匹配成功。所以要将tree2的判空放于tree1的判空前面。
tree1为空有两种情况(1)如果tree1为空&&tree2不为空说明不匹配,
(2)如果tree1为空,tree2为空,说明匹配。
源码:
class TreeNode {//树结构的定义类
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
public class Test1 {
private boolean isSubtree(TreeNode root1, TreeNode root2) {
//如果root2已经遍历完了都能对应的,返回true,注意此时root2判空的位置是在root1前面的。
if (root2 == null) {
return true;
} else if (root1 == null) {
return false;
} else
return root1.val == root2.val && isSubtree(root1.left, root2.left) && isSubtree(root1.right, root2.right);
}
public boolean HasSubtree(TreeNode root1, TreeNode root2) {
//当root1和root2都不为零的时候,才进行比较。否则直接返回false
if (root2 == null || root1 == null) {
return false;
} else {
//如果找到了对应root2的根节点的点,以这个根节点为为起点判断是否包含root2,
//如果找不到,那么就再去root的左儿子当作起点,去判断时候包含root2
//如果还找不到,那么就再去root的右儿子当作起点,去判断时候包含root2
return isSubtree(root1,root2) || HasSubtree(root1.left,root2) || HasSubtree(root1.right,root2);
}
}
}
运行测试:
运行时间:21ms
占用内存:8500k
从测试结果可以看出,确实是差不多的。
总结:
此题的难点在于如果root2已经遍历完了都能对应的(即root2为null时),返回true,注意此时root2判空的位置是在root1前面的。