C++ 二叉搜索树(Binary Search Tree)

本文详细探讨了C++实现的二叉搜索树(Binary Search Tree),包括其基本概念、性质、插入和删除操作的算法实现。通过实例解析,帮助读者掌握如何有效地在二叉搜索树中进行查找、插入和删除操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//  二叉搜索树:
//  A.每个结点都有一个关键码,每个关键码互不相同;
//  B.左子树(若存在)上所有结点的关键码都小于根结点的关键码;
//  C.右子树(若存在)上所有结点的关键码都大于根结点的关键码;
//  D.左子树和右子树也是二叉搜索树
//
//  建立:采取插入建立
//  遍历:采取中序遍历
//
//  测试数据:53 78 65 17 87 09 81 15 -1(结束标志)
#include <iostream>
#include <stack>

template <class T>
struct BSTNode // 二叉搜索树结点的结构定义
{
    T data;
    BSTNode *lChild, *rChild; // 左右孩子指针
};

template <class T>
class BinarySearchTree
{
public:
    BinarySearchTree(BSTNode<T> *p = NULL) {root = p;} // 构造函数
    void createBST(); // 建立二叉搜索树
    bool Insert(T x); // 递归插入
    bool Insert1(T x); // 非递归插入
    bool Pop(T x); // 删除:查找到x,删除x
    void inOrder(); // 中序遍历
    bool seachBST(T x); // 查找函数:递归查找
    bool seachBST1(T x); // 查找函数:非递归查找
    T getMin(); // 获取最小值
    T getMax(); // 获取最大值
private:
    bool seachBST(T x, BSTNode<T> *p); // 递归搜索
    bool Insert(T x, BSTNode<T> *&p); // 递归插入
    bool deleteNode(T x, BSTNode<T> *&p); // 删除结点
    BSTNode<T> *root;
};

// 建立二叉搜索树
template <class T>
void BinarySearchTree<T>::createBST()
{
    int x;
    
    std::cout << "请输入数据建立二叉搜索树:\n";
    std::cin >> x;
    while(x != -1)
    {
        Insert(x);
        std::cin >> x;
    }
}

// 递归插入
template <class T>
bool BinarySearchTree<T>::Insert(T x)
{
    return Insert(x, root);
}

// 递归插入:注意要使用引用符号&,否则每次插入被忽略,root永远为NULL
template <class T>
bool BinarySearchTree<T>::Insert(T x, BSTNode<T> *&p)
{
    BSTNode<T> *newNode;
    
    if(p == NULL) {
        newNode = new BSTNode<T>(); // 新结点
        if(newNode == NULL)
        {
            std::cerr << "申请空间失败!\n";
            exit(1);
        }
        newNode->data = x;
        newNode->lChild = newNode->rChild = NULL;
        p = newNode;
        return true; // 插入成功
    }
    if(x < p->data)
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值