【中等】树的子结构- 2.27

141 阅读1分钟

题目链接:

题目简述:

给定两棵二叉树 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);
};

总结:

  1. isChildTree 用于判断树B是否是树A的子树
  2. 判断以当前节点为根的树pRoot1是否包含树 pRoot2,如果不包含,判断pRoot1的子树是否包含pRoot2