【问题标题】:Find Lowest Common Ancestor BST when one or both node(s) doesnt exist当一个或两个节点不存在时查找最低公共祖先 BST
【发布时间】:2011-12-09 15:19:04
【问题描述】:

我们可以很容易地使用代码在二叉搜索树中找到 LCA:-

public static Node FindLCA(Node root, Node a, Node b)
{           
    if (root == null)
        return null; 

    if (root.IData == a.IData || root.IData == b.IData)
        return root;

    if (root.RightChild != null && (root.RightChild.IData == a || root.RightChild.IData == b))
        return root;

    if (root.LeftChild != null && (root.LeftChild.IData == a || root.LeftChild.IData == b))
        return root;

    if (root.IData > a.IData && root.IData > b.IData)
        return FindLCA(root.LeftChild, a, b);
    if (root.IData < a.IData && root.IData < b.IData)
        return FindLCA(root.RightChild, a, b);
    else
        return root;
}

想知道如果其中一个节点不存在如何处理?一个简单的可能选择是,查找 BST 中是否存在节点 - 这可以在 O(LogN) 时间内完成,然后在必要时调用 FindLCA?是否有任何其他选项无需首先查找密钥是否存在?

编辑 我意识到我之前错过了更多条件,添加了它们,并且还基于下面 vvijay 的回答。

                             20
                     8                 22
               4           12 
                       10       14

问题:

  1. 但现在它无法找到 8 、 22 的 LCA 并说 22 而不是 20。
  2. LCA(8, 12) 是 8 还是 20 - 根据 wiki 对 LCA 的定义,我认为它应该是 8(即我们允许节点成为其自身的后代)。

有什么想法建议吗?

【问题讨论】:

标签: binary-tree


【解决方案1】:

我认为您可以将坏情况分开。

if (root == null) return null;
if (root.Idata == a.Idata || root.Idata == b.Idata) return root;

或者只是在代码中将 return null 更改为 return root。所以 null 返回值意味着您在树中没有至少一个查询节点。

【讨论】:

  • 我不认为那是那里提出的问题。问题是如果节点“a”或节点“b”在树中根本不存在怎么办。
  • @Barry 如果 a 或 b 在树中根本不存在,你不会在 root == null 的情况下结束吗?
  • @gvijay - 它有所帮助,但在其他情况下却失败了。更新了q。
  • 我们删除条件 3 和 4 怎么样。这种情况下的错误是什么?
  • @parsh 如果删除第 3 和第 4 个条件,则 LCA(8,22) 为 20。请检查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-01
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-07
相关资源
最近更新 更多