当一个或两个节点不存在时,查找最低公共祖先BST

时间:2011-12-08 07:32:18

标签: binary-tree

我们可以轻松地使用代码在二进制搜索树中找到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 - 我认为它应该是8基于维基的LCA def(即我们允许节点成为其自身的后代)。
  3. 任何想法建议。?

1 个答案:

答案 0 :(得分:1)

我认为你可以把坏的情况分开。

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

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