Дочерние узлы LCA

Я пытаюсь получить наименее общий предок из двух узлов в дереве. Я попробовал, но проблема в том, if one node is the descendant node for other Я не смог получить LCA.
Я пытался решить ее, тогда она работала только для узлов-потомков. Не знал, как поступить с этим.

Node* Tree::LCA(Node* root, Node* n1, Node* n2) {
list<Node*> a1,a2;

while(n1 != NULL) {
a1.push_back(n1->parent);
n1 = n1->parent;
}

while(n2 != NULL) {
a2.push_back(n2->parent);
n2 = n2->parent;
}

while(!a1.empty() && !a2.empty() && a1.back() == a2.back()) {
a1.pop_back();
a2.pop_back();
}

if( a1.back() != a2.back()) {
Node* rn = a1.back();
cout << " LCA of r-U and r_v is " << rn->index << endl;
}
}

0

Решение

Node* Tree::LCA(Node* root, Node* n1, Node* n2) {
list<Node*> a1,a2;

while(n1 != NULL) {
a1.push_back(n1); // push n1
n1 = n1->parent;
}

while(n2 != NULL) {
a2.push_back(n2);  // push n2
n2 = n2->parent;
}

Node* old; // create new node
while(!a1.empty() && !a2.empty() && a1.back() == a2.back()) {
old = a1.back(); // store the node before popping
a1.pop_back();
a2.pop_back();
}

if( a1.back() != a2.back()) {
// Node* rn = a1.back();  //not needed
cout << " LCA of r-U and r_v is " << old->index << endl; // changed
}
}

Это может быть полезно.

0

Другие решения

Вы начинаете толкать от n1->parent а также n2->parent, Вместо толчка n1 а также n2 а также, прежде чем толкать своих родителей и других предков. Итак, ваш код должен быть:

Node* Tree::LCA(Node* root, Node* n1, Node* n2) {
list<Node*> a1,a2;
a1.push_back(n1); // line to be added

while(n1 != NULL) {
a1.push_back(n1->parent);
n1 = n1->parent;
}

a2.push_back(n2); // line to be added
while(n2 != NULL) {
a2.push_back(n2->parent);
n2 = n2->parent;
}
// rest of code
1

По вопросам рекламы [email protected]