我们可以轻松地使用代码在二进制搜索树中找到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
问题:
任何想法建议。?
答案 0 :(得分:1)
我认为你可以把坏的情况分开。
if (root == null) return null;
if (root.Idata == a.Idata || root.Idata == b.Idata) return root;
或者只是更改返回null以在代码中返回root。因此,null返回值意味着您没有树中的至少一个查询节点。