二叉搜索树

是一种特殊的二叉树

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

实现

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;
}
相关推荐
杜子不疼.4 小时前
【C++ AI 大模型接入 SDK】 - DeepSeek 模型接入(上)
开发语言·c++·chatgpt
石山代码5 小时前
C++ 内存分区 堆区
java·开发语言·c++
张小姐的猫8 小时前
【Linux】多线程 —— 线程互斥
linux·运维·服务器·c++
做人求其滴10 小时前
面试经典 150 题 380 274
c++·算法·面试·职场和发展·力扣
见叶之秋10 小时前
C++基础入门指南
开发语言·c++
计算机安禾10 小时前
【c++面向对象编程】第42篇:模板特化与偏特化:为特定类型定制实现
开发语言·c++·算法
玖釉-10 小时前
C++ 中的循环语句详解:while、do...while、for、嵌套循环与循环控制
开发语言·c++·算法
欧米欧11 小时前
C++进阶数据结构之搜索二叉树
开发语言·数据结构·c++
青小莫11 小时前
C++之vector讲解
c++·stl
计算机安禾12 小时前
【c++面向对象编程】第41篇:函数模板与类模板:泛型编程的基石
开发语言·c++·算法