如果所有元素都不同,它很容易在BST中找到最接近的共同祖先。但是,如果某些值是相同的,那该怎么办呢?到目前为止我们只是比较节点的数据,那就是它,但现在我们需要检查节点的地址而不仅仅是值吗?
答案 0 :(得分:1)
是的,不是仅使用key
进行比较,而是使用(key, address of node)
进行比较。这在处理非唯一键时简化了代码。
答案 1 :(得分:0)
如果没有看到你正在使用什么类型的结构,很难给出细节,但你可以尝试类似这样的伪代码:
struct BST {
struct BST* parent;
struct BST* left;
struct BST* right;
void* value;
}
find_common_ancestor(struct BST* x, struct BST* y)
{
set<struct BST*> ancestors;
// Add all of x's ancestors to set.
while (true) {
ancestors.insert(x);
if (x == NULL)
break;
x = x=>parent;
}
// Check y's ancestors against x's until a match is found.
while (true) {
if (ancestors.count(y) > 0)
return y;
y = y->parent;
}
}
答案 2 :(得分:0)
这是psudocode。只需将它们转换为语法。
GETLeastCommonAn(BINARYTREE BT, NODE A, NODE B)
IF Root==NIL
return NIL
ENDIF
IF Root==A OR root==B
return Root
ENDIF
Left = GETLCA (Root.Left, A, B)
Right = GETLCA (Root.Right, A, B)
IF Left! = NIL AND Right! = NIL
return root
ELSEIF Left! = NIL
Return Left
ELSE
Return Right
ENDIF