Двоичное дерево поиска - Удалить - PullRequest
1 голос
/ 31 марта 2011

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

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

Спасибо!

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;
    }
};

Ответы [ 2 ]

2 голосов
/ 18 апреля 2011

Лакки прав в своих точках.

позвольте мне сказать вам, что при удалении узла вам нужно заменить его либо на максимальный узел в левом поддереве, либо на минимальный узел в правом поддереве.например: если вы видите рисунок ниже: enter image description here

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

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

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

-> присвоить левому узлу 50 и правому узлу 150

-> сделать 75-> next нулевым и удалить 90

1 голос
/ 31 марта 2011

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

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

Задайте себе вопрос: что происходит со значениями в поддереве Right?

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

  1. Введите одно из поддеревьев. Похоже, вы выбрали свое поддерево Left, поэтому мы пойдем оттуда.
  2. Следуйте противоположная линия ветвей. В этом примере продолжайте идти вниз по поддеревам Right от вашего исходного Left. Продолжайте идти, пока не найдете правый листовой узел (нет Right поддеревьев; Left в порядке)
  3. Запомните значение вашего правого листа в переменной tmp.
  4. Переведите Left правого листа (независимо от того, NULL или нет) в положение правого листа.
  5. Возьмите значение tmp и поместите его в исходный узел 'to-delete'е.
...