查找树中两个节点之间的深度差异,而无需一直到根

Posted

技术标签:

【中文标题】查找树中两个节点之间的深度差异,而无需一直到根【英文标题】:Find depth difference between two nodes in a tree without going all the way up to the root 【发布时间】:2021-08-22 07:31:16 【问题描述】:

我遇到了一个我无法弄清楚的问题。

假设一棵二叉树,其中每个节点都有一个指向其父节点的指针和两个子节点。 我们接收 r、p、q(根和树中的两个节点)的输入,我们想要找到 p 和 q 之间的深度差,而不需要一直遍历到根。

限制和假设:

没有内存使用(意味着没有数组,变量都可以) 假设节点 Lowest Common Ancestor 不是根(为简单起见,我们假设 LCA 远离 Big-O 表示法中的根。

只是为了澄清 - 基本上,问题是我们如何在不一直到根部且没有记忆的情况下计算出深度差异。

谢谢!

【问题讨论】:

【参考方案1】:

基本上,问题是我们如何在不一直到根部的情况下找出深度差异...

这并不是说你不能一直遍历到根。它只是说最终的结果可能不是根。

首先,定义一个函数来确定一个节点的深度(伪代码):

function depthOf(r, p):
    depth = 0
    temp = p
    while curr is not r:
        depth++
        temp = temp.parent
    return depth

只需为两个节点调用此函数,然后取差即可。

作为一项附加功能,您可以使用此信息来查找最低共同祖先:

使用深度差从两个节点中最深的节点向上走,直到与另一个节点处于相同深度。从那时起从两个节点串联向上走,直到从两侧到达同一个节点:

function least(r, p, q)
    diff = depthOf(r, p) - depthOf(r, q)  # The answer
    # In order to find least common ancestor, continue as follows:
    while diff > 0:  # p is deeper than q
        p = p.parent
        diff--
    while diff < 0:  # q is deeper than p
        q = q.parent
        diff++
    while p is not q:
        p = p.parent
        q = q.parent
    return p

【讨论】:

嗨 trincot,感谢您的回复,恐怕这不是我想要的。当您通过一直到每个节点的根来确定每个节点的深度时,这是 LCA 问题的解决方案。我的问题是如何在不向上遍历的情况下做到这一点。 我的意思是,挑战中没有任何内容表明你不能一路向上。注意:我只提供了 LCA 解决方案作为补充......这不是我回答的核心。如果您有实际挑战的链接和引用,请将其添加到您的问题中。这可能会澄清限制是什么。 再次感谢您的回复!我更新了问题以澄清该规范。但这正是我的问题,假设从 LCA 到 Root 的距离不是 O(1) 那么如何一直遍历到根。 无法保证你不会用任何算法上到根。你可能会碰到它。我不明白这个限制。除非你有一个保证 LCA 在节点 pq...之上最多 K 个级别...其中 K 是算法。 正如我在上面的问题中添加的那样。假设当 O(long)>f(n)>O(sqrt(logn)) 时,LCA 至少 O(f(n)) 步距节点 - 一些 f 不是 O(1) 并且是一个函数n.换句话说,让我们假设 LCA 离根很远。

以上是关于查找树中两个节点之间的深度差异,而无需一直到根的主要内容,如果未能解决你的问题,请参考以下文章

50树中两个节点的公共祖先

什么是二叉树

993. 二叉树的堂兄弟节点

查找两个文本文件之间的差异,每行一项[重复]

11.求二叉树中节点的最大距离

二叉树的堂兄弟节点