Рассмотрите процедуру удаления по BST, когда узел для удаления будет иметь двух детей. Скажем, я всегда заменяю его узлом, содержащим минимум, вводят его правильное поддерево.
Вопрос: действительно ли эта процедура является коммутативной? Таким образом, при удалении x и затем y имеет тот же результат, чем удаление первого y и затем x?
Я думаю, что ответ не, но я не могу найти контрпример, ни выяснить любое допустимое обоснование.
Править:
Возможно, я должен быть более ясным.
Рассмотрите transplant(node x, node y)
процедура: это заменяет x y (и его поддерево). Так, если я хочу удалить узел (скажите, что x), который имеет двух детей, я заменяю его узлом, содержащим минимум, вводят его правильное поддерево:
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)
Вопрос состоял в том, как доказать, что процедура выше не является коммутативной.
Я отвечаю на второе обновление Вивин.
Я думаю, что это хорошая переделка вопроса:
Является ли удаление коммутативным, когда вы учитывая удаление двух узлов из двоичного дерева поиска, имеющего отношения предков-потомков к друг друга (это означало бы, что они находятся в том же поддереве)?
но это жирное предложение ниже неверно:
Когда вы удаляете узел (скажем, A), вы проходите правое поддерево, чтобы найти минимальный элемент. Этот узел будет листовым узлом и никогда не может быть равным B
, поскольку минимальный элемент в правом поддереве A может иметь правого дочернего элемента . Итак, это не лист.
Назовем минимальный элемент в правом поддереве A преемником (A)
.
Теперь верно, что B не может быть преемником (A)
, но может находиться в своем правом поддереве. Итак, это беспорядок.
Я пытаюсь подвести итог.
Гипотеза :
Другой материал , который мы можем вывести из гипотезы:
преемником (A)
, ни A не является преемником (B)
. Теперь, учитывая это, я думаю, что есть 4 разных случая (как обычно, пусть A является предком B):
преемника ( A)
наследник (A)
является предком B Я думаю (но, конечно, я не могу это доказать), что случаи 1, 2 и 4 не имеют значения.
Таким образом, только в случае, если наследник (A)
является предком B, процедура удаления не может быть коммутативной. Или может?
Я передаю мяч :)
С уважением.
Удаление (в общем случае) не коммутативно. Вот контрпример:
4
/ \
3 7
/
6
Что если мы удалим 4, а затем 3?
Когда мы удалим 4, мы получим 6 в качестве нового корня:
6
/ \
3 7
Удаление 3 не изменит дерево, но даст нам следующее:
6
\
7
Что если мы удалим 3, а затем 4?
Когда мы удалим 3, дерево не изменится:
4
\
7
/
6
Однако, когда мы теперь удалим 4, новым корнем станет 7:
7
/
6
Два получившихся дерева не одинаковы, поэтому удаление не коммутативно.
UPDATE
Я не прочитал ограничение, что это когда вы всегда удаляете узел с двумя детьми. Мое решение предназначено для общего случая. Я обновлю его, если/когда смогу найти контрпример.
ОБНОВЛЕНИЕ
У меня нет конкретных доказательств, но я рискну предположить:
В общем случае вы по-разному обрабатываете удаление в зависимости от того, есть ли у вас два ребенка, один ребенок или нет детей. В контрпримере, который я привел, я сначала удаляю узел с двумя детьми, а затем узел с одним ребенком. После этого я удаляю узел без детей, а затем еще один узел с одним ребенком.
В особом случае удаления только узлов с двумя детьми, вы хотите рассмотреть случай, когда оба узла находятся в одном поддереве (поскольку не имеет значения, если они находятся в разных поддеревьях; вы можете быть уверены, что общая структура не изменится в зависимости от порядка удаления). На самом деле нужно доказать, имеет ли значение порядок удаления узлов в одном и том же поддереве, где каждый узел имеет двух детей.
Рассмотрим два узла A и B, где A является предком B. Тогда вы можете уточнить вопрос следующим образом:
Является ли удаление коммутативным, когда вы рассматриваете удаление двух узлов из дерева бинарного поиска, которые имеют отношения предок-потомок друг с другом (это подразумевает, что они находятся в одном поддереве)?
Когда вы удаляете узел (допустим, A), вы обходите правое поддерево, чтобы найти минимальный элемент. Этот узел будет листовым узлом и никогда не может быть равен B (потому что B имеет двух детей и не может быть листовым узлом). Затем вы замените значение A значением этого листового узла. Это означает, что единственным структурным изменением дерева является замена значения A значением узла-листа и потеря узла-листа.
Тот же самый процесс происходит и для B. То есть, вы заменяете значение узла и заменяете узел-лист. Поэтому в общем случае, когда вы удаляете узел с двумя дочерними узлами, единственным структурным изменением является изменение значения удаляемого узла и удаление листового узла, значение которого вы используете в качестве замены.
Итак, вопрос уточняется:
Можете ли вы гарантировать, что всегда будете получать один и тот же заменяющий узел независимо от порядка удаления (когда вы всегда удаляете узел с двумя дочерними узлами)?
Ответ (я думаю) - да. Почему? Вот несколько наблюдений:
Это не строгое доказательство; это просто некоторые наблюдения, которые я сделал. Не стесняйтесь указывать на дыры!