Процедура удаления для бинарного дерева поиска

голоса
7

Рассмотрим процедуру удаления на BST, когда узел для удаления имеет двух детей. Скажем, я всегда заменить его с узлом, держащим минимальный ключом в его правом поддереве.

Возникает вопрос: эта процедура коммутативной? То есть, удаление х, а затем у имеет один и тот же результат, чем удаление первого у, а затем х?

Я думаю, что ответ нет, но я не могу найти контрпример, ни выяснить какие-либо действительные рассуждения.

РЕДАКТИРОВАТЬ:

Может быть, я должен быть более четким.

Рассмотрим transplant(node x, node y)процедуру: она заменить х на у (и ее поддерево). Так что , если я хочу , чтобы удалить узел (скажем , х) , который имеет двух детей , я заменить его с узлом , держащего минимальный ключ в его правом поддереве:

y = minimum(x.right)
transplant(y, y.right) // extracts the minimum (it doesn't have left child)
y.right = x.right
y.left = x.left
transplant(x,y)

Вопрос заключался в том, чтобы доказать, вышеописанная процедура не является коммутативной.

Задан 07/06/2010 в 15:46
источник пользователем
На других языках...                            


4 ответов

голоса
17

Удаление (в общем случае) не является коммутативной. Вот контрпример:

    4
   / \
  3   7
     /
    6

Что делать, если мы удалим 4, а затем 3?

Когда мы удаляем 4, мы получаем 6 как новый корень:

   6
  / \
 3   7

Удаление 3 не изменяет дерево, но дает нам следующее:

  6
   \
    7

Что делать, если мы удалим 3 и затем 4?

Когда мы удаляем 3 дерево не меняется:

 4
  \
   7
  /
 6

Однако, когда мы теперь удалить 4, новый корень становится 7:

  7
 /
6

Два полученных деревьев не то же самое, поэтому удаление не является коммутативным.

ОБНОВИТЬ

Я не читал, что ограничение это когда вы всегда удалить узел с 2-мя детьми. Мое решение для общего случая. Я буду обновлять его, если / когда я могу найти контрпример.

Очередное обновление

У меня нет конкретных доказательств, но я собираюсь догадка:

В общем случае, вы регулируете делеции по-разному в зависимости от того у вас двое детей, один ребенок, или нет детей. В контрпримере я обеспечил, я сначала удалить узел с двумя детьми, а затем узел с одним ребенком. После этого я удалить узел без детей, а затем другой узел с одним ребенком.

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

Рассмотрим два узла A и B, где А является предком B. Тогда вы можете дополнительно уточнить вопрос будет:

Является ли удаление коммутативное, когда вы рассматриваете удаление двух узлов из бинарного дерева поиска, которые имеют предок-потомок отношения друг к другу (это означало бы, что они находятся в одной и то же поддереве)?

При удалении узла (скажем, А), вы траверс правой суб-дерева, чтобы найти минимальный элемент. Этот узел будет листовым узлом и никогда не может быть равен B (поскольку B имеет двух детей и не может быть листовым узлом). Вы бы тогда заменить значение A со значением этого листа-узла. Что это означает, что только структурные изменения в дерево является замена величины А с величиной листового узла, и потерей листьев-узел.

Тот же самый процесс вовлечен для B. То есть, заменить значение узла и заменить лист-узел. Таким образом , в общем случае , при удалении узла с двумя детьми, единственным структурным изменением является изменение значения узла удаляемого и удаление узла листа Кто это значение , которое вы используете в качестве замены .

Таким образом, вопрос доработан:

Можете ли вы гарантировать, что вы всегда получите тот же узел замены независимо от порядка удаления (если вы всегда удаляемого узла с двумя детьми)?

Ответ (я думаю) это да. Зачем? Вот несколько наблюдений:

  • Допустим, вы удалите потомок узла первого и второго предком узла. Суб-дерево , которое было изменено , когда вы удалили узел - потомок находится не в левом поддереве правого ребенка предком узла. Это означает , что к югу от дерева остается неизменным. То , что это также означает, независимо от порядка удаления, два различных суб-деревья изменяются и , следовательно , операция является коммутативной.
  • Опять же , допустим , вы удалите потомок узла первого и второго предком узла. Суб-дерево , которое было изменено , когда вы удалили узел - потомок находится в левом поддереве правого ребенка предком узла. Но даже здесь, нет никакого перекрытия. Причина заключается в том, когда вы удаляете узел - потомка первых, вы посмотрите на левом поддерево потомка узла правого ребенка. Когда вы удалите узел предка, вы никогда и не идти вниз , что к югу от дерева , так как вы будете всегда идти к левой стороне после ввода левого поддерева правой кнопки ребенка предка узла в. Так опять же , независимо от того, что вы удаляете первый вы изменяете различные суб-деревья , и поэтому появляется порядок не имеет значения.
  • Другое дело, если вы удалите узел предок первым , и вы обнаружите , что минимальный узел является дочерним узлом потомка. Это означает , что узел потомок будет в конечном итоге с одним ребенком, и удаление одного ребенка тривиально. Теперь рассмотрим случай , когда в этом случае, вы удалили потомок узла первой. Тогда вы бы заменить значение потомка узла с правом ребенка , а затем удалить правильный ребенок. Затем , когда вы удалите узел предка, вы в конечном итоге найти ту же минимальный узел (левый ребенок старого удаляемого узла, который также является левым потомком замещаемого узла). В любом случае, вы в конечном итоге с той же структурой.

Это не строгое доказательство; это лишь некоторые замечания, которые я сделал. Все средства, не стесняйтесь тыкать отверстие!

Ответил 07/06/2010 в 18:32
источник пользователем

голоса
0

Я здесь ответить на второе обновление Vivin в.

Я думаю, что это хорошая переделка вопроса:

Является ли удаление коммутативное, когда вы рассматриваете удаление двух узлов из бинарного дерева поиска, которые имеют предок-потомок отношения друг к другу (это означало бы, что они находятся в одной и то же поддереве)?

но это смелое предложение ниже это не так:

При удалении узла (скажем , А), вы траверс правой суб-дерева , чтобы найти минимальный элемент. Этот узел будет листовым узлом и никогда не может быть равна B

так как минимальный элемент в правом поддереве элементов а может иметь правильный ребенок . Таким образом, это не лист. Давайте назовем минимальный элемент в правом поддереве элементов а successor(A). Теперь, это правда , что B не может быть successor(A), но это может быть в правом поддереве. Таким образом, это беспорядок.

Я пытаюсь подвести итог.

Гипотеза :

  1. А и В имеют двое детей каждый.
  2. А и В находятся в одной и то же поддереве.

Другие вещи мы можем вывести из гипотезы:

  1. В не successor(A), ни А successor(B).

Теперь, учитывая, что, я думаю, что есть 4 разные случаи (как обычно, давайте быть предком В):

  1. B находится в левом поддереве элементов а
  2. В является предком successor(A)
  3. successor(A) является предком B
  4. B и преемник (A) не имеют никакого отношения. (Они находятся в разных поддеревьев страны А)

Я думаю , (но, конечно , я не могу это доказать) , что случаи 1, 2 и 4 не имеет значения. Так, только в том случае successor(A)является предком процедуры удаления B не может быть коммутативным. Или может?

Я передаю мяч:)

С уважением.

Ответил 11/06/2010 в 18:45
источник пользователем

голоса
2

Мне кажется, что контрпример показано в ответ Vivin является единственным случаем некоммутативности, и что она действительно устраняется тем ограничением, что только узлы с двумя детьми, могут быть удалены.

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

    7
   /
  6
никогда не будет достигнуто, если мы начинаем

    4
   / \
  3 7
     /
    6

Вместо этого мы сначала удалить 3 (без преемника), а затем удалить 4 (с 6 в качестве преемника), получая

    6
     \
      7

что то же самое, как если бы был отменен порядок удаления.

Удаление затем будет коммутативной, и я думаю, что это всегда коммутативной, учитывая помещение я назвал (преемник всегда маленький узел в правом поддереве удаляемого узла).

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

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

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

  2. Потомок в левом поддереве предка. Эта ситуация не повлияет на коммутативности , поскольку преемник исходит из правого поддерева и не может повлиять на левое поддерево на всех.

  3. Потомок в правом поддереве предка. Если преемник предка всегда самый маленький узел в правом поддереве, то порядок удаления не может изменить выбор преемника, независимо от того , что потомок удаляется до или после того, как предка. Даже если наследник предка оказывается узел - потомка , который также должны быть удалены, что потомок тоже заменяются следующим по величине узла к нему, и что потомок не могут иметь свое собственное левое поддерево остальные будет рассмотрено , Так удаление предка и любого правого поддерева потомка всегда будет коммутативной.

Ответил 06/04/2011 в 19:34
источник пользователем

голоса
0

Я думаю , что есть два одинаково жизнеспособных способов удаления узла, когда он имеет 2 детей:
SKIP TO ДЕЛУ 4 ...

Случай 1: удалить 3 (узел Leaf)
 2 3
 / \ -> / \
1 3 1


Случай 2: удалить 2 (левый дочерний узел)
 2 3
 / \ -> / \
1 3 1


Случай 3: удаление 2 (правый дочерний узел)
 2 2
 / \ -> / \
1 3 3

______________________________________________________________________
Случай 4: удаление 2 (левая и правые дочерние узлы)
 2 2 3
 / \ -> / \ или / \      
1 3 1 3
работы и имеют разные результирующие дерева :) ______________________________________________________________________
Как объяснено здесь алгоритм: HTTP: // WWW .mathcs.emory.edu / ~ Cheung / Курсы / 323 / Программа курса / Trees / AVL-delete.html Deleting a node with 2 children nodes: 1) Replace the (to-delete) node with its in-order predecessor or in-order successor 2) Then delete the in-order predecessor or in-order successor

Ответил 10/10/2016 в 01:02
источник пользователем

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