Самый низкий общий предок в бинарном дереве поиска - PullRequest
2 голосов
/ 06 августа 2011

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

Ответы [ 3 ]

1 голос
/ 06 августа 2011

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

0 голосов
/ 05 сентября 2014

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

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
0 голосов
/ 06 августа 2011

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

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