我正在尝试获取树中两个节点的最不常见的祖先。我试过了,但问题是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 :(得分:1)
您开始从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 :(得分: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
}
}
这可能会有所帮助。