c++二叉搜索数模拟实现(代码)

二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:
1.若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
2.若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
3.它的左右子树也分别为二叉搜索树


#pragma once
#include<iostream>
using namespace std;

template<class T>
struct bstnode
{
	T _val;
	bstnode* _left;
	bstnode* _right;
	bstnode(const T& val) :_val(val), _left(nullptr), _right(nullptr)
	{}


	~bstnode()
	{
		_left = nullptr;
		_right = nullptr;
		_val = 0;
	}

};



template<class T>
class BST
{
	
public:
	typedef bstnode<T> bstnode;
	BST() :_node(nullptr)
	{}




	bool push(const T& data)
	{
		bstnode* root = _node;
		bstnode* rootp = nullptr;
		if (_node == nullptr)
		{
			bstnode *temp = new bstnode(data);
			_node = temp;
			return true;
		}
		while (root)
		{
			if (data < root->_val)
			{
				rootp = root;
				root = root->_left;
			}
			else if (data > root->_val)
			{
				rootp = root;
				root = root->_right;
			}
			else
			{
				return false;
			}
		}
		bstnode *newnode = new bstnode(data);
		if (newnode->_val > rootp->_val)
		{
			rootp->_right = newnode;
		}
		else
		{
			rootp->_left = newnode;
		}
		return true;
	}


	bool erase(const T&data)
	{
		bstnode* root = _node;
		bstnode* rootp = nullptr;
		while (root)
		{
			//找节点
			if (data < root->_val)
			{
				rootp = root;
				root = root->_left;
			}
			else if (data > root->_val)
			{
				rootp = root;
				root = root->_right;
			}
			else
				break;
		}
			//如果为空直接返回false
			if (root == nullptr)
				return false;
			if (root == _node)
				rootp = root;
			//如果root左边是空
			if (root->_left == nullptr)
			{
				
				if (rootp->_left == root)
				{
					if (root == _node)
					{
						_node = root->_right;
					}
					else
					{
						rootp->_left = root->_right;
					}
				}
				else
				{
					if (root == _node)
					{
						_node = root->_right;
					}
					else
					{
						rootp->_right = root->_right;
					}
				}
				delete  root;
			}
			//如果右边是空
			else if (rootp->_right == nullptr)
			{
				if (rootp->_left == root)
				{
					rootp->_left = root->_left;
				}
				else
				{
					rootp->_right = root->_left;
				}
				delete root;
			}
			//如果两边都不为空
			else
			{
				bstnode* find = root->_right;
				bstnode* findp = root;
				while (find->_left)
				{
					findp = find;
					find = find->_left;
				}
				root->_val = find->_val;
				if (root == findp)
				{
					findp->_right = find->_right;
				}
				else
				{
					findp->_left = find->_right;
				}
				delete find;
			}
			return true;
	}
	


	bool find(const T& data)
	{
		bstnode* root = _node;
		while (root)
		{
			if (root->_val < data)
			{
				root = root->_left;
			}
			else if (root->_val > data)
			{
				root = root->_right;
			}
			else
			{
				return true;
			}

			return false;
		}
	}


	void print()
	{
		print(_node);
		cout << endl;
	}


private:
	void print(bstnode* root)
	{
		if (root == nullptr)
		{
			return;
		}
		print(root->_left);
		cout << root->_val << " ";
		print(root->_right);
	}
	bstnode* _node;
};

相关推荐

  1. c++搜索模拟实现(代码)

    2024-07-16 21:36:02       18 阅读
  2. C++】 搜索树复习+模拟实现

    2024-07-16 21:36:02       35 阅读
  3. 搜索模拟实现

    2024-07-16 21:36:02       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-16 21:36:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-16 21:36:02       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-16 21:36:02       58 阅读
  4. Python语言-面向对象

    2024-07-16 21:36:02       69 阅读

热门阅读

  1. C#面 :dot net core工程里面有哪些常见的工程文件?

    2024-07-16 21:36:02       17 阅读
  2. docker部署项目命令

    2024-07-16 21:36:02       20 阅读
  3. ns3-gym入门(二):linear-mesh例子详解

    2024-07-16 21:36:02       16 阅读
  4. 数据结构与算法-09贪心算法&动态规划

    2024-07-16 21:36:02       16 阅读
  5. 访问者模式(大话设计模式)C/C++版本

    2024-07-16 21:36:02       17 阅读
  6. Logstash常用的filter四大插件

    2024-07-16 21:36:02       18 阅读
  7. RTOS中断与任务的同步

    2024-07-16 21:36:02       19 阅读
  8. 哈希表(知识点+leetcode)以及字符串哈希

    2024-07-16 21:36:02       21 阅读
  9. 运维检查:mysql表自增id是否快要用完

    2024-07-16 21:36:02       19 阅读
  10. C++设计模式(装饰器模式)

    2024-07-16 21:36:02       18 阅读
  11. 哪些点权衡素材优秀与否

    2024-07-16 21:36:02       18 阅读
  12. 前端反显后端图片、上传预览图片

    2024-07-16 21:36:02       19 阅读