Menu
CoddyTech

Subtree of Another Tree

给你两棵二叉树,root 和 subRoot,它们都按层序存储在数组中:根节点位于索引 0,索引 i 的子节点分别位于 2*i+1(左侧)和 2*i+2(右侧),空位置用 -1 表示。数组末尾可能有多余的 -1 项。

如果 root 中存在某个节点,且该节点及其所有后代的形状和值都与 subRoot 完全相同,则返回 true;否则返回 false。整个 root 也算在内。

函数

isSubtree(root: integer-array, subRoot: integer-array) → boolean
rootinteger-array
要搜索的树,按层序排列,空位置用 -1 表示
subRootinteger-array
要查找的树,格式保持一致
返回值boolean
如果 subRoot 作为一个节点出现在 root 中,且其所有后代节点也都包含在内,则为 true,否则为 false

约束条件

  • 1 ≤ root.length ≤ 32767 且 1 ≤ subRoot.length ≤ 32767
  • 每个条目都是 -1,或介于 0 到 104 之间的值。
  • root[0] 和 subRoot[0] 都不为 -1,因此两棵树至少各有一个节点。
  • 任一数组的末尾都可能在最后一个节点之后多出一些 -1 项。
  • 空位置的两个子节点也都是空的,并且每棵树的深度最多为 14。
  • 值可以重复。

示例

输入
root = [6, 2, 8, 1, 3, -1, 9]subRoot = [2, 1, 3]
输出
true
解释
索引 1 处的节点 2 的子节点是 1 和 3,它们都是叶节点。这正是 subRoot。
challenge icon

进阶

你能根据每棵子树的值及其子节点的指纹,为每棵子树生成指纹,从而让它与 subRoot 的比较只需 O(1) 时间吗?如果两棵不同的子树发生哈希冲突,你该怎么办?

重置代码
def isSubtree(root, subRoot):
    # 在这里编写代码

测试 #1

测试 #2

测试 #3

参数

root = [6, 2, 8, 1, 3, -1, 9]
subRoot = [2, 1, 3]

预期输出

true