【发布时间】: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
问题:
- 但现在它无法找到 8 、 22 的 LCA 并说 22 而不是 20。
- LCA(8, 12) 是 8 还是 20 - 根据 wiki 对 LCA 的定义,我认为它应该是 8(即我们允许节点成为其自身的后代)。
有什么想法建议吗?
【问题讨论】:
-
stackoverflow.com/a/8622173/1011995 也处理这种情况。
标签: binary-tree