0

ツリー内の 2 つのノードの最も一般的でない祖先を取得しようとしています。試してみましたが、問題はif one node is the descendant node for otherLCAを取得できなかったことです。
私はそれを解決しようとしましたが、それは子孫ノードに対してのみ機能していました。これを進める方法がわかりませんでした。

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;
    }
}
4

2 に答える 2

1

n1->parentとから押し始めn2->parentます。代わりに、両親n1n2他の祖先をプッシュする前に、プッシュしてください。したがって、コードは次のようになります。

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
于 2013-03-13T10:46:27.473 に答える
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 
    }
}

これは役立つかもしれません。

于 2013-03-13T11:03:57.143 に答える