题目链接:
- 力扣:树的子结构
题目简述:
给定两棵二叉树
tree1和tree2,判断tree2是否以tree1的某个节点为根的子树具有 相同的结构和节点值 。
注意,空树 不会是以tree1的某个节点为根的子树具有 相同的结构和节点值 。
题解:
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} A
* @param {TreeNode} B
* @return {boolean}
*/
var isSubStructure = function(A, B) {
// 约定空树不是任意一个树的子结构
if (!A || !B) {
return false
}
// 判断以当前节点为根的树pRoot1是否包含树 pRoot2
// 如果不包含,判断pRoot1的子树是否包含pRoot2
return isChildTree(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B)
};
// 判断树B是否是树A的子树
// 只有当树 B 的所有节点都在树 A 中对应的位置存在且值相等时,才认为树 B 是树 A 的子树
function isChildTree (A, B) {
// B子树是空子树,是A的子结构(A包含的结点超过B的结点)
if (!B) return true;
// A子树是空子树,B非空,不可能是A的子结构
if (!A) return false;
// 两个结点的值不相等,B不可能是A的子结构
if (A.val !== B.val) return false;
// 递归判断左子树和右子树
return isChildTree(A.left, B.left) && isChildTree(A.right, B.right);
};
总结:
- isChildTree 用于判断树B是否是树A的子树
- 判断以当前节点为根的树pRoot1是否包含树 pRoot2,如果不包含,判断pRoot1的子树是否包含pRoot2