二叉搜索树

是一种特殊的二叉树

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

实现

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;
}
相关推荐
熬夜敲代码的猫1 小时前
C++:让你玩转多态
c++·多态
qeen871 小时前
【数据结构】二叉树基本概念及堆的C语言模拟实现
c语言·数据结构·c++·
lynnlovemin1 小时前
C++高精度加减乘除算法详解
开发语言·c++·算法·高精度
minji...1 小时前
Linux 网络套接字编程(七)TCP服务端和客户端的实现——网络版本计算器
linux·运维·服务器·网络·c++·tcp/ip·udp
郝学胜-神的一滴2 小时前
epoll 反应堆模型深度拆解:从红黑树到回调闭环,手写高性能回射服务器
linux·运维·服务器·开发语言·c++·unix
小张成长计划..2 小时前
【C++】26:用哈希表封装unordered_set和unordered_map
c++·散列表
故事和你912 小时前
洛谷-算法2-4-字符串2
开发语言·数据结构·c++·算法·深度优先·动态规划·图论
cpp_25012 小时前
P3374 【模板】树状数组 1
数据结构·c++·算法·题解·洛谷·树状数组
郝学胜-神的一滴2 小时前
干货版《算法导论》 02 :算法效率核心解密
java·开发语言·数据结构·c++·python·算法