удаление в бинарном дереве поиска

голоса
5

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

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

например:
A:

      50   
     / \  
    10  75  
   /   / \  
  1   60   90                 

B:

     10
     / \
    1   75

Результирующее дерево должно быть:

     50
       \
        60
         \ 
          90

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

A2: Другой подход немного странно. Я нахожу Симметричный и обход дерева А. Найти и удалить все узлы дерева B с помощью бинарного поиска вместе с рекурсией (мы не изменить предзаказ). Наконец recostruct наш BST от заказовМои (оставшейся) и предзаказа (без изменений).

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

Задан 31/08/2011 в 10:06
источник пользователем
На других языках...                            


2 ответов

голоса
0

Как я понимаю, почему вы не делать заказовМои обход б. Затем, пока массив не является пустым, делать регулярно удалять из а при значении индекса массива. Прослеживание представляет собой О (п) и удаление для каждого индекса будет O (LOGN). В целом, эта операция будет O (NlogN).

Ответил 31/08/2011 в 10:27
источник пользователем

голоса
6

Задача А

Я предполагаю, что эти два дерева сбалансированы.

void deleteTree(node* A, node* B)
{
    if(A == NULL || B == NULL)
        return;

    if(A->data == B->data)
    {
        deleteTree(A->left, B->left);
        deleteTree(A->right, B->right);
        removeNode(A); // Normal BST remove
    }
    else if(A->data > B->data)
    {
        Node* right = B->right;
        B->right = NULL;
        deleteTree(A->left, B);
        deleteTree(A, right);
    }
    else // (A->data < B->data)
    {
        Node* left = B->left;
        B->left = NULL;
        deleteTree(A->right, B);
        deleteTree(A, left);
    }
}

Временная сложность:

T(N) = 2 * T(N / 2) + O(1)

Таким образом, общая сложность O (N) в соответствии с основной теоремой. Сложность пространства O (1) . Одним из недостатков является I Б. разрушается

PS: У меня нет реализации BST под рукой, так что я не могу проверить код для вас. Но я думаю, что идея правильная.

Задача B

Используйте хэш - таблицу для одного дерева и пересечь другую. Вы получите O (N) для времени и пространства сложности.

Ответил 31/08/2011 в 14:12
источник пользователем

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