Menu
CoddyTech

Lowest Common Ancestor of a Binary Tree

你会得到一个以数组 root 表示的二叉树,节点按堆顺序排列:根节点位于索引 0,索引 i 的左、右子节点分别位于 2*i+1 和 2*i+2,空位置用 -1 表示。节点值互不相同,且没有特定顺序。

返回 p 和 q(两个不同节点的值)的最低公共祖先的值,也就是子树同时包含这两个节点的最深节点。子树包含其顶部节点,因此如果 q 位于 p 的下方,答案就是 p。

函数

lowestCommonAncestor(root: integer-array, p: integer, q: integer) → integer
rootinteger-array
按层序排列的二叉树,其中 -1 表示空位置
pinteger
一个节点的值
qinteger
另一个节点的值
返回值integer
其子树同时包含 p 和 q 的最低节点的值

约束条件

  • 2 ≤ root.length ≤ 32767
  • 每个 root[i] 都是 -1,或满足 0 ≤ root[i] ≤ 104 的值。
  • root[0] 永远不会是 -1,而且树至少有两个节点。
  • 数组的末尾可能会在最后一个节点之后多出一些 -1 项。
  • 空位置的两个子节点也都是空的,且深度最多为 14。
  • 树中的所有值都各不相同,并且没有遵循任何顺序。
  • p 和 q 是树中两个不同节点的值,顺序任意。

示例

输入
root = [8, 3, 10, 6, 4, 12, 1, -1, -1, 7, 9]p = 6q = 9
输出
3
解释
6 是 3 的左子节点,9 位于 4 的下方,在 3 的右侧,所以它们在 3 处相遇。比较值会指向根节点 8:6 更小,9 更大。
challenge icon

进阶

如果 p 或 q 可能不存在,并且用 -1 作为答案,那么单次遍历中的哪种快捷方法会失效?你又如何仍然只遍历一次就完成?

重置代码
def lowestCommonAncestor(root, p, q):
    # 在这里编写代码

测试 #1

测试 #2

测试 #3

参数

root = [8, 3, 10, 6, 4, 12, 1, -1, -1, 7, 9]
p = 6
q = 9

预期输出

3