二叉搜索树

是一种特殊的二叉树

比父亲节点值大的在右,小的在左用于查找。

实现

cpp 复制代码
#pragma once

template<class K>//身体
struct BSNode {
	K _key;
	BSnode<K>* _left;
	BSnode<k>* _right;
	BSnod(const K& key) 
		:_key(key)
		,_left(nullptr)
		,_right(nullptr)
	{}
};
template<class K>
class BStree {
	typedef BSNode<K> Node;//using node=BSnode<K>
public:
	bool Insert(const K& key) {//插入的逻辑
		if (_root == nullptr) {
			_root = new Node(key);
			return true;
		}
		Node* parent = nullptr;
		Node* cur = _root;
		while (cur) {//到达插入位置;
			if (cur->_key > key) {
				parent = cur;
				cur = cur->left;
			}
			else if (cur->_key < key) {
				parent = cur;
				cur = cur->_right;
			}
			else
			{
				return false;
			}
		}
		cur = new Node(key);
		if (parent->_key > key) {
			parent->_left=newnode;
		}
		else{
			parent->_right=newnode;
		}
		return true;
	}
private:
	node* _root = nullptr;
};

插入

先判断是否是空树

不是空树不断下找到空位;

删除

cpp 复制代码
bool Erase(const K& key) {
    if (_root == nullptr) {
        return false;
    }
    Node* parent = nullptr;
    Node* cur = _root;
    while (cur) {
        if (cur->_key > key) {
            parent = cur;
            cur = cur->_left;
        }
        else if (cur->_key < key) {
            parent = cur;
            cur = cur->_right;
        }
        else {
            // 找到了目标节点 cur,开始删除
            // 情况1:左子树为空(包含左右都为空的叶子节点)
            if (cur->_left == nullptr) {
                if (cur == _root) {
                    _root = cur->_right;
                }
                else {
                    if (parent->_left == cur) {
                        parent->_left = cur->_right;
                    }
                    else {
                        parent->_right = cur->_right;
                    }
                }
                delete cur;
            }
            // 情况2:右子树为空(此时左子树一定不为空)
            else if (cur->_right == nullptr) {
                if (cur == _root) {
                    _root = cur->_left;
                }
                else {
                    if (parent->_left == cur) {
                        parent->_left = cur->_left;
                    }
                    else {
                        parent->_right = cur->_left;
                    }
                }
                delete cur;
            }
            // 情况3:左右子树都不为空
            else {
                // 寻找右子树的最左节点(后继节点)
                Node* Rparent = cur;
                Node* R = cur->_right;
                while (R->_left) {
                    Rparent = R;
                    R = R->_left;
                }

                // 替换值
                cur->_key = R->_key;
                // Rparent 的左孩子指向 R 的右孩子(R 一定没有左孩子)
                if (Rparent->_left == R) {
                    Rparent->_left = R->_right;
                }
                else {
                    // 处理 R 刚好就是 cur->_right 的情况
                    Rparent->_right = R->_right;
                }
                delete R;
            }
            return true;
        }
    }
    return false;
}
相关推荐
code_pgf1 小时前
C++11 / C++14 / C++17 / C++20 新特性总结
c++·c++20
颜x小5 小时前
[C#] C++与c#语法对比
开发语言·c++·c#
汉克老师6 小时前
GESP2026年3月认证C++八级( 第三部分编程题(2、子图最短路)精讲
c++·最短路·floyd·gesp8级
abcd_zjq7 小时前
海康线扫相机使用
c++·海康
十五年专注C++开发7 小时前
C++设计一个函数来求容器元素绝对值之和的平均值
c++·模板·accumulate
SilentSlot7 小时前
【C/C++】手写 DPDK 协议栈(十一):基于 PPS、SYN 比例和源 IP 熵的 DDoS 检测
c语言·c++·tcp/ip
王老师青少年编程8 小时前
csp信奥赛C++高频考点专项训练:【排序算法】案例9:成绩排序
c++·排序算法·csp·高频考点·信奥赛·成绩排序
程序喵大人8 小时前
【C++进阶】STL容器与迭代器 - 05 map 和 set 为什么按键保持有序
开发语言·c++·容器·迭代器·stl
ShineWinsu9 小时前
对于Linux:HTTP中cookie、session的解析
linux·网络·c++·网络协议·http·cookie·session
库克克9 小时前
【C++】 unordered_map 与unordered_set
开发语言·c++