Ее довольно легко найти ближайший общий предок в BST, если все элементы различны. Но что, если некоторые значения одинаковы. До сих пор мы просто сравнение данных узлов, и это было, но теперь мы должны проверить адреса узлов вместо значений?
Самый низкий общий предок в бинарном дереве поиска
голоса
2
3 ответов
голоса 1
1
Да, вместо того , чтобы использовать только ваш keyдля сравнения, использовать (key, address of node)для сравнения. Это упрощает код при работе с неоднородными ключами.
голоса 0
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;
}
}
голоса 0
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













