Бинарное дерево поиска - Удалить

голоса
1

Я пытаюсь написать программу, которая принимает в строках и помещает их в бинарном дереве поиска в алфавитном порядке, как только они будут вставлены в дерево, пользователь запрашивает одно слово, чтобы быть удалено, таким образом, исключить этот узел из дерева, а затем выход дерево без этого узла обратно в порядке.

Все работает для этого до функции удаления, удаления функция делает работу, но очень странно, как он удаляет. Я думаю, что в настоящее время он удаляет полную сторону дерева, потому что когда я удалить последнее слово, он обычно работает. Я буду загружать свою функцию удаления и, если необходимо сделать еще больше, я могу загрузить остальную часть моего кода.

Благодаря!

template<typename T> void Delete(TreeNode<T>*& root, const T& data)
{
    if (root == NULL)
        return;
        if(data < root->Value)
            return Delete(root->Left, data);
        else if (root->Value > data)
            return Delete(root->Right, data);
        else
        {
            TreeNode<T>* old_root = root;
            if (root->Left == NULL)
            {
                root = root->Right;
            }
            else if (root->Right == NULL)
            {
                root = root->Left;
            }
            else
            {
                replace_parent(old_root, old_root->Left);
            }
            delete old_root;



    }

};

template<typename T> void replace_parent(TreeNode<T>*& old_root, TreeNode<T>*& root)
{
    if (root->Right != NULL)
    {
        replace_parent(old_root, root->Right);
    }
    else
    {
        old_root->Value = root->Value;
        old_root = root;
        root = root->Left;
    }
};
Задан 31/03/2011 в 03:24
источник пользователем
На других языках...                            


2 ответов

голоса
1

Ваши дела для левых или правых существ NULLхороши. Тем не менее, ваша логика ни один из них является NULL, к сожалению, не удается.

Если я читаю ваш код (и понимание функции replace_parent()правильно, то если ни дерево пусто вы заменяете текущий корень с Left.

Спросите себя - то , что происходит со значениями , которые находятся в Rightподдереве?

Что нужно сделать для того, чтобы удалить узел выглядит следующим образом:

  1. Введите одно из поддеревьев. Похоже , вы выбрали свое Leftподдерево, так что мы будем идти оттуда.
  2. Следуйте противоположную линию ветвей. В этом примере, продолжайте идти вниз по Rightподдеревам от оригинала Left. Продолжайте до тех пор , пока не найдете узел правого листьев (нет Rightподдерев, LeftКИ)
  3. Помните значение правого листка в tmpпеременном.
  4. Перенести правую коку Left(независимо от того , NULLили нет) в положение правого листа в.
  5. Возьмите tmpзначение и поместить его в исходное «к-удаления» узла.
Ответил 31/03/2011 в 03:38
источник пользователем

голоса
2

Lacqui правильно в своих точках.

позвольте мне сказать вам, что при удалении узла вы должны заменить его либо макс узла в дереве слева к югу или минимального узла в правом поддереве дерева. например: если вы видите на картинке ниже: введите описание изображения здесь

если вы хотите, чтобы удалить узел 90, вам необходимо позаботиться о том, необходимо заменить его либо 80, который является его максимальный узел в левом поддереве или 92, который минимальный узел в правом поддереве дерева. Вы можете сохранить любой один подход.

поэтому алго будет: учитывая левый суб дерево:

-> если вы нашли узел для удаления, перейдите к максимальному значению в его леве дерева к югу.

-> назначить левый узел как 50 и справа узел, чтобы быть 150

-> сделать 75-> следующая утратившим удалить 90

Ответил 18/04/2011 в 11:22
источник пользователем

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