Nejnižší společný předek v binární vyhledávací strom

hlasů
2

Jeho docela snadné najít nejbližší společný předek v BST-li všechny prvky jsou zřetelné. Ale co když některé hodnoty jsou stejné. Doteď jsme byli jen srovnáním údajů uzlů a tím to skončilo, ale nyní potřebujeme pro kontrolu adresy uzlů namísto pouhých hodnot?

Položena 06/08/2011 v 11:25
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
1

Ano, namísto použití právě váš keyke srovnání použít (key, address of node)pro srovnání. To zjednodušuje kód, pokud se jedná o non-unikátních klíčů.

Odpovězeno 06/08/2011 v 11:31
zdroj uživatelem

hlasů
0

Aniž by viděl, jaké struct, který používáte, je těžké dát specifika, ale můžete zkusit něco takového pseudokódu:

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;
    }
}
Odpovězeno 06/08/2011 v 11:41
zdroj uživatelem

hlasů
0

Zde je psudocode. jen převést do 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
Odpovězeno 05/09/2014 v 07:17
zdroj uživatelem

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