Найти преемник без использования родительского указателя

голоса
1

Преемником элемента в BST является преемником элемента в отсортированном порядке, определенном заказовМои обхода. Поиск преемника, когда каждый узел имеет указатель на родительский узел представлен в Clrs алгоритма учебника игровая (Введение в алгоритмы по MIT Press).

Идея найти преемника здесь - если правое поддерево узла xне пусто, правопреемником xявляется минимальным элементом в правом поддереве. В противном случае, правопреемником является наименьшим предок xкоторого слева ребенок также является предком x(предполагая , что узел является предком сам по себе).

Можем ли мы найти преемника, не используя указатель на родительский узел?

Иногда наше дерево узел не имеет этот указатель. Я изо всех сил пару часов, но не могу писать правильный код.

Задан 26/09/2010 в 00:39
источник пользователем
На других языках...                            


5 ответов

голоса
0

Если у вас нет доступа к указателю на родительский узел, то вы должны знать, кто отец. Если вы не знаете, как вы могли бы пойти на дереве?

Ответил 26/09/2010 в 00:55
источник пользователем

голоса
2

Это должно работать:

TREE-SUCCESSOR(T, x)
  if right[x] != NIL
    return TREE-MINIMUM(right[x])
  else
    return FIND-TREE-SUCCESSOR(root[T], x, NIL)

FIND-TREE-SUCCESSOR(y, x, c)
  if y = x
    return c
  if key[x] < key[y]
    return FIND-TREE-SUCCESSOR(left[y], x, y)
  else
    return FIND-TREE-SUCCESSOR(right[y], x, c)

FIND-TREE-SUCCESSORдержит в c(кандидата в ) последний узел , в котором мы свернули налево.

Ответил 26/09/2010 в 01:15
источник пользователем

голоса
5

Вдохновленный решения Шелдона, это нерекурсивна вариант решения.


if (right[x]  != NIL)
    return min(right[x]);
else
{
    candidate = NIL;
    y = root; 
    while  (y!= x) // y is used as a probe
if (key[x] < key[y]) { candidate = y; y = y ->left;
} else y = y->right; } return candidate;
Если кандидата == NIL, х макс в дереве и не имеет преемника.

Ответил 26/09/2010 в 18:17
источник пользователем

голоса
1

Я нашел элегантное решение для упорядоченную преемника без родительского указателя здесь -> http://www.geeksforgeeks.org/archives/9999

Идея

1.Если узел имеет правый суб-дерево, то его преемник является наименьшим элементом в правом поддереве

  1. Если право поддерево узла является пустым, то его преемник один из его предков, которые могут быть найдены сверху вниз без родительского указателя со следующим алгоритмом:

пусть сначала current_node быть корнем, succ_node = NULL;

case1: Если поиск элемент меньше current_node, то текущий элемент является потенциальным преемником - место succ_node на current_node и переместите current_node к ее левому узлу (поскольку поисковый элемент находится в левом поддереве)

Вариант 2: Если поиск элемента больше, то current_node, его не является потенциальным преемником (как меньший элемент может быть преемником?). Поэтому не нужно размещать succ_node здесь, но переместить current_node направо.

повторять процесс, пока не достигнете нулевой или сам элемент и возвращает succ_node.

Ответил 13/09/2012 в 01:17
источник пользователем

голоса
0

Рекурсивный решение Java может выглядеть следующим образом:

public Integer successor(Integer value) {
    Node n = succ(root, value, null);
    if (null != n) {
       return n.value;
    }
    return null;
}

private Node succ(Node n, Integer x, Node p) {
    if (null == n) {
        return null;
    }

    if (x < n.value) {
        return succ(n.left, x, n);
    } else if (x > n.value) {
        return succ(n.right, x, p);
    }
    if (null != n.right) {
        return min(n.right);
    }
    return p;
}

Как клиент, мы просто передать в значении узла, от которого мы хотим знать преемник. Тогда мы начинаем искать от корня, пока мы не нашли значение, которое мы искали. В настоящее время существует два случая:

  1. Если текущий узел имеет правильный ребенок, то преемник наименьший элемент в правом поддереве текущего узла
  2. В противном случае, это был узел р (родительский указатель), который был обновлен только тогда, когда мы пошли налево в дереве
Ответил 09/09/2013 в 17:41
источник пользователем

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