二叉搜索树(BSTree)

BST性质

二叉搜索树(Binary Search Tree,BST)是一种二叉树数据结构,也叫二叉排序树其中每个节点最多有两个子节点,通常称为左子树和右子树。二叉搜索树具有以下性质:

  • 若左子树不为空,左子树所有结点的值都比根节点值小
  • 若右子树不为空,右子树 所有结点的值都比根节点值大
  • 根结点的左右子树也是二叉搜索树

比如下图是搜索二叉树

image.png
下图不是搜索二叉树(左子树值比根结点值大,不符合性质)
image.png

BST实现

实现BST,先构建一个结点类。结点需要三个成员变量,结点的值,左孩子和右孩子

template<class K>
struct BStreeNode
{
   
   
	BStreeNode<K>* _left;//左孩子
	BStreeNode<K>* _right;//右孩子
	K _key;//结点值
        //构造
	BStree(const K& key = K())
		:_left(nullptr)
		, _right(nullptr)
		, _key(key)
	{
   
   }
};

BST类接口

template<class K>
class  BSTree 
{
   
   
	typedef BStreeNode<K> Node;
public:
	//构造
	BSTree();

	//拷贝构造
	BSTree(const BSTree<K>& bst);

	//赋值运算符
	BSTree<K>& operator=(BSTree<K> t);

	//析构
	~BSTree();

	//插入
	void Insert(cosnt K& key);

	//删除
	void Erase(cosnt K& key);

	//查找
	Node* Find(cosnt K& key);
private:
	Node _root;
};

构造函数

初始化一个空的BST

BSTree()
    :_root(nullptr)
{
   
   }

拷贝构造函数

拷贝构造需要完成深拷贝,将现有的BST拷贝给一个新的BST即可,需要递归进行拷贝。而拷构造函数是成员函数
C++成员函数递归时,一般在套一层子函数进行递归

image.png

Node* _Copy(Node* root)
{
   
   
    if (root == nullptr)
    {
   
   
            return nullptr;
    }
    Node* node_copy = new Node(root->_key);
    node_copy->_left = _Copy(root->_left);//拷贝左子树
    node_copy->_right = _Copy(root->_right);//拷贝右子树
    return node_copy;
}
BSTree(const BSTree<K>& bst)
{
   
   
    _root = _Copy(bst._root);
}

赋值运算符重载

  • 赋值时,如果当前对象有内容,应该先删除当前对象
  • 在完成深拷贝
//释放时要自底向上释放,否则找不到左右孩子结点了
void _Destoy(Node* root)
{
   
   
    if (nullptr == root)
    {
   
   
            return;
    }
    _Destoy(root->_left);
    _Destoy(root->_right);
    delete root;
}
BSTree<K>& operator=(BSTree<K> t)
{
   
   
    if (&t != this)//防止自己给自己赋值
    {
   
   
            _Destory(this->_root);//删除当前对象
            _root = _Copy(t._root);
    }
}

析构函数

自底向上依次删除,最后置空即可

~BSTree()
{
   
   
    _Destory(_root);
    _root = nullptr;
}

插入元素

插入时,可以分为以下两种情况:

  • 空树:直接将待插入元素做为根节点
  • 非空:根据二叉树得性质进一步细分情况
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

C++下等马

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

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

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

打赏作者

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

抵扣说明:

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

余额充值