Je sais que des questions similaires ont déjà été posées, mais je pense que ma solution est beaucoup plus simple. Surtout par rapport à Wikipedia.Existe-t-il un meilleur moyen de trouver le plus bas ancêtre commun?
S'il vous plaît me prouver le contraire!
Si vous avez un arbre avec des nœuds qui ont la structure de données donnée:
struct node
{
node * left;
node * right;
node * parent;
int key;
}
Vous pouvez écrire une fonction comme ceci:
node* LCA(node* m, node* n)
{
// determine which of the nodes is the leftmost
node* left = null;
node* right = null;
if (m->key < n->key)
{
left = m;
right = n;
}
else
{
left = n;
right = m;
}
// start at the leftmost of the two nodes,
// keep moving up the tree until the parent is greater than the right key
while (left->parent && left->parent->key < right->key)
{
left = left->parent;
}
return left;
}
Ce code est assez simple et le pire des cas est O (n), cas moyen c'est probablement O (logn), surtout si l'arbre est équilibré (où n est le nombre de nœuds dans l'arbre).
Merci pour l'explication! – theninjagreg