Удаление в двоичном дереве поиска

Мне дали два двоичных валкости поиска. Например, A и B. Далее меня попросили удалить дерево B из дерева A.

Удалением, я имею в виду удалить все узлы, присутствующие в B от A. Примечание: B не обязательно подмер A.

, например:
A:

  50
  / \
  10 75.
  / / \
  1 60 90.
 

B:

  10
  / \
  1 75.
 

Полученное дерево должно быть:

  50
  \
  60.
  \
  90.
 

Два подхода пришли на мой взгляд:
A1:
Узел * DELETETREE (узел * а, узел * б);
Возьмите корня дерева B. Удалите этот узел из дерева A (обычным методом удаления BST). Затем разделите проблему на две части - для левого поддерева B и правого поддерева B. для каждого из поддерева, Recurse. Для левого поддерева, узел, который занимал узел, который был удален, должен служить корнем для дерева A. Для правого поддерева, преемник неисправности удаленного узла должен сервер в качестве корня для дерева A.

A2: Другой подход немного странный. Я нахожу внешнее или предварительно придержать обход дерева A. Найти и удалить все узлы в дереве B, используя бинарный поиск вместе с рекурсией (мы не модифицируем предварительный заказ). Наконец-то повторно вспомните нашу BST от INORDORD (оставшегося) и предварительного заказа (без изменений).

Проб А: найти эффективный способ для BST.
Проб б: найдите эффективный способ для любого бинарного дерева (не только BST).

7
задан vine'th 31 August 2011 в 15:37
поделиться