C ++ - Создание класса дерева двоичного поиска, один узел исчезает после поворота - PullRequest
0 голосов
/ 01 ноября 2011

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

#include <iostream>

using namespace std;

template <typename T>
class MRBST {
public:
    MRBST();
    ~MRBST();

    void push(const T &);
    bool search(const T &);
    void PrintPreorder();
private:
    struct Node {
        T data;
        Node *left;
        Node *right;

        Node (const T & theData, Node *lt, Node *rt) 
        : data(theData), left(lt), right(rt) {}
    };
    Node *root;

    void push(const T &, Node * &) const;
    void remove(const T &, Node * &) const;
    Node* findMin(Node *t) const {
        if (t == NULL) {
            return NULL;
        }
        if (t->left == NULL) {
            return t;
        }
        return findMin(t->left);
    }
    void preorder(Node * &);
    bool search(const T &, Node *);
    Node* findNode(const T & x, Node * t) {
        if (t == NULL) {
            return NULL;
        }
        if (x < t->data) {
            return findNode(x, t->left);
        } else if (x > t->data) {
            return findNode(x, t->right);
        } else if (x == t->data) {
            return t;
        }
        return NULL;
    }
    void rotate(Node *);
};

template <typename T>
void MRBST<T>::PrintPreorder() {
    preorder(root);
    cout << endl;
}

template <typename T>
void MRBST<T>::preorder(Node * & t) {
    if (t != NULL) {
        cout << t->data << endl;
        preorder(t->left);
        preorder(t->right);
    }
}

template <typename T>
bool MRBST<T>::search(const T & x) {
    if (search(x, root)) {
        Node *temp = findNode(x, root);
        rotate(temp);
        return true;            
    } else {
        return false;
    }
}

template <typename T>
void MRBST<T>::rotate(Node * k1) {
    if (k1->right == NULL) {
        return;
    } else {
        Node *temp = k1->right;
        k1->right = temp->left;
        temp->left = k1;
    }
}


template <typename T>
bool MRBST<T>::search(const T & x, Node *t) {
    if (t == NULL) {
        return false;
    } else if (x < t->data) {
        return  search(x, t->left);
    } else if (x > t->data) {
        return search(x, t->right);
    } else {
        return true;
    }
}

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

#include <iostream>
#include "MRBST.h"

using namespace std;

int main() {
    MRBST<int> binaryTree;
    binaryTree.push(5);
    binaryTree.push(20);
    binaryTree.push(3);
    binaryTree.push(3);
    binaryTree.push(4);
    binaryTree.push(22);
    binaryTree.push(17);
    binaryTree.push(18);
    binaryTree.push(8);
    binaryTree.push(9);
    binaryTree.push(1);
    binaryTree.PrintPreorder();
    cout << endl;
    binaryTree.search(17);
    binaryTree.PrintPreorder();
    cout << endl;

}

С выводом, который выглядит примерно так:

5 3 1 4 20 17 8 9 18 22 * ​​1009 *

5 3 1 4 2017 8 9 22 * ​​1011 *

Если бы кто-нибудь мог дать некоторое представление о том, что происходит с моей функцией поворота, это было бы очень полезно.

Ответы [ 2 ]

1 голос
/ 01 ноября 2011

Почему вы делаете rotate в поиске? Это должно быть только для чтения.

Вы теряете узел из-за этого.

Посмотрите на свои rotate:

    Node *temp = k1->right;
    k1->right = temp->left;
    temp->left = k1;

Предположим, что k1 = x имеет right = y и left = z, посмотрите шаг за шагом:

    Node *temp = k1->right;

temp = k1-> right = y, k1 = x, k1-> left = z

    k1->right = temp->left;

k1-> right =?, K1-> left = z, temp = y

    temp->left = k1;

k1-> right =?, K1-> left = z, temp-> left = x.

Теперь - куда ты ушел? Вы потеряли это.

0 голосов
/ 01 ноября 2011

Посмотрите внимательно на вашу функцию rotate (), шаг за шагом, чтобы увидеть, делает ли она то, что вы хотите, или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...