如何在C++中实现一个高效的二叉搜索树(BST)?

Number of views 76

请设计一个支持插入、删除和查找操作的二叉搜索树,并分析其时间复杂度。

1 Answers

要实现一个高效的二叉搜索树(BST),我们首先需要定义树节点结构。接着,我们将实现插入、删除和查找操作。为了提高效率,我们可以使用自平衡二叉搜索树(如AVL树或红黑树)。这里,我将提供一个简单的二叉搜索树的实现,但请注意它可能退化为链表,导致最坏情况下的时间复杂度为O(n)。对于更高效的选择,请考虑实现AVL树或红黑树。

#include <iostream>

struct TreeNode {
    int value;
    TreeNode* left;
    TreeNode* right;

    TreeNode(int val) : value(val), left(nullptr), right(nullptr) {}
};

class BinarySearchTree {
public:
    BinarySearchTree() : root(nullptr) {}

    void insert(int value) {
        if (root == nullptr) {
            root = new TreeNode(value);
        } else {
            insertHelper(root, value);
        }
    }

    bool search(int value) {
        return searchHelper(root, value);
    }

    void remove(int value) {
        root = removeHelper(root, value);
    }

private:
    TreeNode* root;

    void insertHelper(TreeNode*& node, int value) {
        if (value < node->value) {
            if (node->left == nullptr) {
                node->left = new TreeNode(value);
            } else {
                insertHelper(node->left, value);
            }
        } else {
            if (node->right == nullptr) {
                node->right = new TreeNode(value);
            } else {
                insertHelper(node->right, value);
            }
        }
    }

    bool searchHelper(TreeNode* node, int value) {
        if (node == nullptr) {
            return false;
        } else if (node->value == value) {
            return true;
        } else if (value < node->value) {
            return searchHelper(node->left, value);
        } else {
            return searchHelper(node->right, value);
        }
    }

    TreeNode* removeHelper(TreeNode*& node, int value) {
        if (node == nullptr) {
            return nullptr;
        } else if (value < node->value) {
            node->left = removeHelper(node->left, value);
        } else if (value > node->value) {
            node->right = removeHelper(node->right, value);
        } else {
            // Node with the target value found

            if (node->left == nullptr && node->right == nullptr) {
                delete node;
                node = nullptr;
            } else if (node->left == nullptr) {
                TreeNode* temp = node;
                node = node->right;
                delete temp;
            } else if (node->right == nullptr) {
                TreeNode* temp = node;
                node = node->left;
                delete temp;
            } else {
                // Node has two children
                int minValue = findMinValue(node->right);
                node->value = minValue;
                node->right = removeHelper(node->right, minValue);
            }
        }
        return node;
    }

    int findMinValue(TreeNode* node) {
        while (node->left != nullptr) {
            node = node->left;
        }
        return node->value;
    }
};

插入、查找和删除操作的时间复杂度取决于树的高度。在最优情况下(即树是完全平衡的),这些操作的时间复杂度为O(log n),其中n是树中的节点数。然而,在最坏的情况下(例如,当树退化为链表时),这些操作的时间复杂度将为O(n)。为了避免这种情况,可以考虑使用自平衡二叉搜索树,如AVL树或红黑树。