Самый низкий общий предок в бинарном дереве поиска

голоса
2

Ее довольно легко найти ближайший общий предок в BST, если все элементы различны. Но что, если некоторые значения одинаковы. До сих пор мы просто сравнение данных узлов, и это было, но теперь мы должны проверить адреса узлов вместо значений?

Задан 06/08/2011 в 11:25
источник пользователем
На других языках...                            


3 ответов

голоса
1

Да, вместо того , чтобы использовать только ваш keyдля сравнения, использовать (key, address of node)для сравнения. Это упрощает код при работе с неоднородными ключами.

Ответил 06/08/2011 в 11:31
источник пользователем

голоса
0

Не видя, какие структуры вы используете, это трудно дать специфику, но вы можете попробовать что-то вроде этого псевдокода:

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;
    }
}
Ответил 06/08/2011 в 11:41
источник пользователем

голоса
0

здесь psudocode. просто конвертировать их в синтаксисе.

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
Ответил 05/09/2014 в 07:17
источник пользователем

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