模拟实现二叉搜索树超详解(C++)

在这里插入图片描述

😇 😇各位小伙伴,大家好啊!我是bug.今天我们的内容比较简单,就讲讲二叉搜索树的性质和模拟实现
(代码可能会有一点问题,请各位老铁指正 😘 😘 )

一、 🌱 二叉搜索树

✏️ ✏️ 二叉搜索树(Binary Search Tree):又名二叉排序树,二叉查找树。空树也是二叉排序树。

🌳🌳性质 如果左子树不为空,那么左子树的结点数据均小于根结点的数据。
如果右子树不为空,那么右子树的结点数据均大于根结点的数据。
同时,它的左右子树也是二叉排序树。

🍉 🍉优点:既有链表的快速插入与删除操作的特点,又有数组快速查找的优势。
它的中序遍历可以完成排序的操作。
当其接近于完全二叉树时,其增删查改的时间复杂度为O(logN)。
因为接近完全二叉树时,它的每次操作就相当于二分情况。
(如下图)

在这里插入图片描述

🍉 🍉缺点:插入数据接近有序时,就会出现极为不平衡的情况,这时候它的增删查改就会退化成O(N)。(如下图)

在这里插入图片描述

🌵🌵 延伸:对于二叉排序树,它的结构无疑十分优秀的。但是它的缺点也十分致命,一旦退化,其效率会大幅度降低。所以对此引出了AVL树(高度平衡二叉搜索树)和红黑树,它们都通过各自的规则来对树的平衡进行控制,达到接近完全二叉树,当然它们增删查改的时间复杂度都是O(logN),后面我们会进行模拟实现的。

二、 🌱 二叉搜索树的模拟实现

☀️ ☀️二叉树的查找、插入、删除都可以使用递归和非递归的版本,下面我们会实现。
🍒 🍒二叉搜索树的模拟实现⬇️ ⬇️:

#pragma once

#include<iostream>
using std::cin;
using std::cout;
using std::endl;

namespace lz
{
   
	//创建二叉搜索树的结点
	template<class T>
	class BSTreeNode
	{
   
	public:
		BSTreeNode(const T& data = T())
			:_left(nullptr)
			, _right(nullptr)
			, _data(data)
		{
   }

		BSTreeNode<T>* _left;
		BSTreeNode<T>* _right;
		T _data;
	};

	//二叉搜索树
	template<class T>
	class BSTree
	{
   	
	public:
		//构造
		typedef BSTreeNode<T> Node;

		BSTree(const T& data = T())
			:_root(new Node)
		{
   
			_root->_data = data;
		}


		//拷贝构造
		BSTree(const BSTree<T>& t)
		{
   
			_root = copy(t._root);
		}

		//赋值运算符重载
		BSTree<T>& operator=(const BSTree<T>& t)
		{
   
			BSTree tmp(t);
			std::swap(tmp._root, _root);
			return *this;
		}

		//非递归插入
		bool insert(const T& data)
		{
   
			Node* cur = _root;
			Node* parent = _root;

			while (cur)
			{
   
				if (cur->_data > data)//往左边去找
				{
   
					parent = cur;
					cur = cur->_left;
				}
				else if (cur->_data < data)//往右边去找
				{
   
					parent = cur;
					cur 
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

今天也要写bug

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

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

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

打赏作者

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

抵扣说明:

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

余额充值