class TreeNode {
  constructor(val, left, right) {
    this.val = (val === undefined ? 0 : val);
    this.left = (left === undefined ? null : left);
    this.right = (right === undefined ? null : right);
  }
}

/**
 * @param {TreeNode} root
 * @param {TreeNode} subRoot
 * @return {boolean}
 */
const isSubtree = (root, subRoot) => {
  let queue = [root];

  const isNodeSame = (node, sub) => {
    if ((node?.val ?? null) !== (sub?.val ?? null)) return false;
    if (null === node && null === sub) return true;
    return isNodeSame(node?.left ?? null, sub?.left ?? null) && isNodeSame(node?.right ?? null, sub?.right ?? null);
  }

  while (queue.length > 0) {
    let curr = queue.shift(), left = curr.left, right = curr.right;
    if (isNodeSame(curr, subRoot)) return true;
    if (null !== left) queue.push(left);
    if (null !== right) queue.push(right);
  }

  return false;
};