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