二叉搜索树实现 C++

二叉树搜索树(BST)

二叉搜索树是一种二叉树,是应用非常广泛的一种二叉树,英文简称为BST。又称为:二叉查找树、二叉排序树



BST的特点

二叉树搜索树特点

  • 任意一个节点的值都大于其左子树所有节点的值
  • 任意一个节点的值都小于其右子树所有节点的值
    在这里插入图片描述

SBT的接口

bool add(const T& x)
bool remove(const T& x)
bool contains(const T& x)
bool empty()
size_t size()


C++实现

#include <vector>
#include <iostream>
#include <queue>
#include <algorithm>

using namespace std;


template<class T>
class BinarySearchTree
{

	struct TreeNode
	{
		T _val;
		TreeNode* _left;
		TreeNode* _right;
		TreeNode* _parent;

		TreeNode(const T& val, TreeNode* parent = nullptr) :
			_val(val), _left(nullptr), _right(nullptr), _parent(parent)
		{}
	};

public:

	bool add(const T& x)
	{
		if (_root == nullptr)
		{
			_root = new TreeNode(x);
			_size++;
			return true;
		}

		TreeNode* cur = _root;
		while (cur)
		{
			if (cur->_val > x)
			{
				if (cur->_left)
					cur = cur->_left;
				else
				{
					cur->_left = new TreeNode(x, cur);
					_size++;
					return true;
				}
			}
			else if (cur->_val < x)
			{
				if (cur->_right)
					cur = cur->_right;
				else
				{
					cur->_right = new TreeNode(x, cur);
					_size++;
					return true;
				}
			}
			else
				return false;

		}//end of while


		return false;
	}


	bool remove(const T& x)
	{
		if (empty())		return false;

		if (size() == 1)
		{
			_size--;
			delete _root;
			_root = nullptr;
			return true;
		}

		TreeNode* cur = _root;
		bool find = false;
		while (cur)
		{
			if (cur->_val < x)
				cur = cur->_right;
			else if (cur->_val > x)
				cur = cur->_left;
			else
			{
				find = true;
				break;
			}
		}//end fo while

		if (!find)	return false;	//没找到直接返回


		if (cur->_left && cur->_right)
		{

			TreeNode* prev = cur->_left;
			while (prev && prev->_right)
				prev = prev->_right;

			cur->_val = prev->_val;
			cur = prev;
		}

		if (cur->_left || cur->_right)
		{
			TreeNode* child = cur->_left ? cur->_left : cur->_right;

			if (cur->_parent)
			{

				if (cur->_parent->_left == cur)
				{
					cur->_parent->_left = child;
					child->_parent = cur->_parent;
				}
				else {
					cur->_parent->_right = child;
					child->_parent = cur->_parent;
				}
			}
			else
			{

				_root = child;
				child->_parent = nullptr;
			}


		}
		else
		{

			if (cur->_parent->_left == cur)
				cur->_parent->_left = nullptr;
			else
				cur->_parent->_right = nullptr;

		}

		_size--;
		delete cur;
		return true;
	}


	bool contains(const T& x)
	{
		if (empty())	return false;

		TreeNode* cur = _root;
		while (cur)
		{
			if (cur->_val > x)
				cur = cur->_left;
			else if (cur->_val < x)
				cur = cur->_right;
			else
				return true;

		}//end of while

		return false;
	}

	bool empty()
	{
		return _root == nullptr;
	}

	size_t size()
	{
		return _size;
	}


private:
	TreeNode* _root = nullptr;
	size_t _size = 0;
};

复杂度分析


最优情况下增删改查的时间复杂度为O(logN)

在这里插入图片描述

最坏情况下,BST就变成了链表,时间复杂度退化为O(N)

在这里插入图片描述

普通BST没有什么意义,需要在添加、删除的过程保持树的高度为logN,这样的树才有意义,如 AVL树、红黑树、SB树。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

necesse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值