关于二叉树的一些基本操作,C++

这篇博客详细介绍了如何使用C++实现一个二叉搜索树(BST),包括插入、查找、删除、遍历等基本操作。通过示例代码展示了层序遍历、前序遍历、中序遍历和后序遍历的方法,并提供了删除最小值和最大值节点的功能。
摘要由CSDN通过智能技术生成
#include <iostream>
#include <cassert>
#include <queue>

using namespace std;

template<typename Key, typename Value>

class BST{
private:
    struct Node{
        Key key;
        Value value;
        Node *left;
        Node *right;

        Node(Key key, Value value){
            this->key = key;
            this->value = value;
            this->left = this->right = NULL;
        }

        Node(Node *node){
            this->key = node->key;
            this->value = node->value;
            this->left = node->left;
            this->right = node->right;
        }
    };

    Node *root;
    int count;

public:
    BST(){
        root = NULL;
        count = 0;
    }

    ~BST(){
        destroy(root);
    }

    int size(){
        return count;
    }

    bool isEmpty(){
        return count == 0;
    }

    void insert(Key key, Value value){
        root = insert(root, key, value);
    }

    bool contain(Key key){
        return contain(root, key);
    }

//    因为c++返回值不能为空,所以这里返回一个指针,
//    防止因为找不到元素导致报错
    Value* search(Key key){
        return search( root, key);
    }

    void preOder(){
        preOder(root);
    }

    void inOder(){
        inOder(root);
    }

    void postOrder(){
        postOrder(root);
    }

//    层序遍历(广搜)
    void levelOrder(){
        queue<Node*> q;
        q.push(root);
        while ( !q.empty() ){
            Node *node = q.front();
            q.pop();
            cout << node->key << endl;

            if( node->left )
                q.push( node-> left );
            if( node->right )
                q.push( node->right );
        }
    }

//  寻找最小的键值
    Key minimum(){
        assert( count != 0 );
        Node* minNode = minimum( root );
        return minNode->key;
    }

//  寻找最大的键值
    Key maximum(){
        assert( count != 0 );
        Node* maxNode = maximum( root );
        return maxNode->key;
    }

//    删除最小值所在节点
    void removeMin(){
        if( root )
            root = removeMin( root );
    }

//    删除最大值所在节点
    void removeMax(){
        if( root )
            root = removeMax( root );
    }

//    删除键值为key的节点
    void remove(Key key){
        root = remove(root, key);
    }

private:
//插入结点
    Node* insert(Node *node, Key key, Value value){
        if( node == NULL ){
            count ++;
            return new Node(key, value);
        }
        if( key == node->key)
            node->value = value;
        else if( key < node->key )
            node->left = insert(node->left , key, value);
        else
            node->right = insert(node->right, key, value);
        return root;
    }

//查找是否有元素
    bool contain(Node* node, Key key, Value value){
        if( node == NULL )
            return false;
        if( key == node->key )
            return true;
        else if( key < node->key )
            return contain( node->left, key);
        else
            return contain( node->right, key);
    }

//    查找key对应的value
    Value* search(Node* node, Key key){

        if( node == NULL )
            return NULL;
        if( key == node->key )
            return &(node->value);
        else if( key < node->key )
            return search( node->left , key);
        else
            return search( node->right , key);
    }


//前序遍历
    void preOrder(Node* node){
        if( node != NULL ){
            cout << node->key << endl;
            preOder(node->left);
            preOder(node->right);
        }
    }

//中序遍历
    void inOrder(Node* node){
        if( node != NULL){
            inOder(node->left);
            cout << node->key << endl;
            inOder(node->right);
        }
    }

//后序遍历
    void postOrder(Node* node){
        if( node != NULL ){
            postOrder(node->left);
            postOrder(node->right);
            cout << node->key << endl;
        }
    }

    void destroy(Node* node){
        if( node != NULL ){
            destroy( node-> left );
            destroy( node-> right);

            delete node;
            count --;
        }
    }

    Node* minimum(Node* node){
        if(node->left == NULL)
            return node;
        return minimum(node->left);
    }

    Node* maximum(Node* node){
        if(node->right == NULL)
            return node;
        return maximum(node->right);
    }

    Node* removeMin(Node* node){
        if( node->left == NULL ){
            Node* rightNode = node->right;
            delete node;
            count--;
            return rightNode;
        }
        node->left = removeMin(node->left);
        return node;
    }

    Node* removeMax(Node* node){
        if( node->right == NULL ){
            Node* leftNode = node->left;
            delete node;
            count--;
            return leftNode;
        }
        node->right = removeMax(node->right);
        return node;
    }

    Node* remove(Node* node, Key key){
        if( node == NULL )
            return NULL;
        if( key < node->key ){
            node->left = remove( node->key, key);
            return node;
        }
        else if( key > node->key ){
            node->right = remove( node->right, key);
            return node;
        }
        else{
            if( node->left == NULL ){
                Node *rightNode = node->right;
                delete node;
                count --;
                return rightNode;
            }
            if( node->right == NULL ){
                Node *leftNode = node->left;
                delete node;
                count --;
                return leftNode;
            }

            Node *delNode = node;
            Node *successor = new Node(minimum(node->right));
            count++;
            successor->right = removeMin(node->right);
            successor->left = node->left;

            delete delNode;
            count--;
            return successor;
        }
    }
};


int main(){
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值