C++ - 创建二叉搜索树类,旋转后一个节点消失

标签 c++ rotation binary-tree

我正在尝试创建一个自定义二叉搜索树,我已经完成了除旋转功能之外的所有操作,该功能似乎没有移动节点。 rotate 函数仅在搜索和找到节点时调用,并且该节点具有右子节点。为简单起见,我将只添加其中使用的函数,以使其更短:

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

我有一个简单的测试文件,它只是将一些数字添加到树中,然后进行搜索,然后在 Preordering 中打印出来。

#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

5 3个 1个 4个 20 17 8个 9 22

如果有人能深入了解我的旋转功能出了什么问题,那将是一个很大的帮助。

最佳答案

为什么要在搜索中执行 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.

现在 - Y 去哪儿了?你弄丢了。

关于C++ - 创建二叉搜索树类,旋转后一个节点消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7960792/

相关文章:

c++ - 如何在默认构造函数中初始化对空字符串的类成员引用

android - 旋转 Exoplayer

php - Hackerrank 圆形数组旋转在 php 中未通过 100,000 次旋转测试

c++ - 在构建二叉树时尝试创建指向父节点的指针

c - 在二叉树中搜索元素,函数总是返回0

c++ - 如何为 ideone.com 中的代码文件指定自定义文件名?

c++ - 为什么我不能在我的程序中声明一个字符串 : "string is undeclared identifier"

c++ - C++ 方法没有被覆盖?

html - 轻松对齐旋转按钮

c - 在 C 中为二叉树实现 'insert' 函数