Ancêtre commun le plus bas dans un arbre de recherche binaire

voix
2

Son assez facile de trouver le plus proche ancêtre commun dans un BST si tous les éléments sont distincts. Mais si certaines valeurs sont les mêmes. Jusqu'à présent, nous étions simplement comparer les données des noeuds et qui était, mais maintenant nous avons besoin de vérifier l'adresse de nœuds au lieu de juste valeurs?

Créé 06/08/2011 à 11:25
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
1

Oui, au lieu d'utiliser seulement votre keypour la comparaison, utiliser (key, address of node)à titre de comparaison. Cela simplifie le code en traitant avec des clés non uniques.

Créé 06/08/2011 à 11:31
source utilisateur

voix
0

Sans voir quel genre de struct que vous utilisez, il est difficile de donner des détails, mais vous pouvez essayer quelque chose comme ça pseudocode:

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;
    }
}
Créé 06/08/2011 à 11:41
source utilisateur

voix
0

voici psudocode. il suffit de les convertir en syntaxe.

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
Créé 05/09/2014 à 07:17
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more