二叉树之-比较两数是否相同与B树是否是A树的子结构
最近刷题时遇到判断B树是否是A树的子结构的问题,总结一下思路和与判断两树是否完全相同的区别
思路
- 判断两树是否完全相同的思路:
if(A==null&&B==null) return true;
if(A!=null&&B!=null&&A.val==B.val)
{
return compareStructure(A.left,B.left)&&compareStructure(A.right,B.right);
}
return false;
2.判断以节点B为根节点的树是否是以节点A为根节点的树的子结构
public static boolean isSub(TreeNode tree1, TreeNode tree2) {
if (tree2 == null) {
return true;}
// 如果tree2为null了,说明是其子结构,
//因为tree2整个树都已经和tree1的某颗子树进行了完整比较,且都相同
if (tree1.val != tree2.val) {
return false;}
// 此时tree1和tree2两颗树相同节点的值不相同,说明tree2不是tree1的子结构
if (tree1 == null) {// 此时tree1已经没有可用于比较的节点,而tree2还有未比较的节点,说明树2不是树1为根节点的子结构
return false;
}
// 上述条件都未满足,则继续判断当前节点的左子树和右子树是否相等
return isSub(tree1.left, tree2.left) && isSub(tree1.right, tree2.right);
}
3.总结:
-
比较同样是比较以A,B为根节点的两树是否相等与一树是否是另一个树的子结构的思路区别在于要考虑到B=null的情况。
-
如果比较两树是否完全相同:当A和B只有一个=null时,就返回false;
-
而比较一树是否是另一个树的子结构:此时B可能只是A的一部分, 根节点相同,但相比于A B的结构可能少一部分,所以当B的所有节点都比较完但没出现false的情况,即为true了;而此时可能A尚有未比较的节点。