Удаление (в общем случае) не является коммутативной. Вот контрпример:
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. То есть, заменить значение узла и заменить лист-узел. Таким образом , в общем случае , при удалении узла с двумя детьми, единственным структурным изменением является изменение значения узла удаляемого и удаление узла листа Кто это значение , которое вы используете в качестве замены .
Таким образом, вопрос доработан:
Можете ли вы гарантировать, что вы всегда получите тот же узел замены независимо от порядка удаления (если вы всегда удаляемого узла с двумя детьми)?
Ответ (я думаю) это да. Зачем? Вот несколько наблюдений:
- Допустим, вы удалите потомок узла первого и второго предком узла. Суб-дерево , которое было изменено , когда вы удалили узел - потомок находится не в левом поддереве правого ребенка предком узла. Это означает , что к югу от дерева остается неизменным. То , что это также означает, независимо от порядка удаления, два различных суб-деревья изменяются и , следовательно , операция является коммутативной.
- Опять же , допустим , вы удалите потомок узла первого и второго предком узла. Суб-дерево , которое было изменено , когда вы удалили узел - потомок находится в левом поддереве правого ребенка предком узла. Но даже здесь, нет никакого перекрытия. Причина заключается в том, когда вы удаляете узел - потомка первых, вы посмотрите на левом поддерево потомка узла правого ребенка. Когда вы удалите узел предка, вы никогда и не идти вниз , что к югу от дерева , так как вы будете всегда идти к левой стороне после ввода левого поддерева правой кнопки ребенка предка узла в. Так опять же , независимо от того, что вы удаляете первый вы изменяете различные суб-деревья , и поэтому появляется порядок не имеет значения.
- Другое дело, если вы удалите узел предок первым , и вы обнаружите , что минимальный узел является дочерним узлом потомка. Это означает , что узел потомок будет в конечном итоге с одним ребенком, и удаление одного ребенка тривиально. Теперь рассмотрим случай , когда в этом случае, вы удалили потомок узла первой. Тогда вы бы заменить значение потомка узла с правом ребенка , а затем удалить правильный ребенок. Затем , когда вы удалите узел предка, вы в конечном итоге найти ту же минимальный узел (левый ребенок старого удаляемого узла, который также является левым потомком замещаемого узла). В любом случае, вы в конечном итоге с той же структурой.
Это не строгое доказательство; это лишь некоторые замечания, которые я сделал. Все средства, не стесняйтесь тыкать отверстие!