数据结构 - 二叉搜索树封装 C++
二叉搜索树封装代码
#pragma once
#include <iostream>
using namespace std;
template<class T>class TreeNode {
public:
	TreeNode(T value)
	{
		this->val = value;
		this->right = NULL;
		this->left = NULL;
	}
	TreeNode() { }
	T val;
	TreeNode *left;
	TreeNode *right;
};
template<class T>class BST {
public:
	BST();
	void Insert(T value);			//插入元素接口
	void InOrder();					//打印中序序列接口
	int  GetSize();					//返回当前二叉树总元素个数
	int  GetMaxValue();				//返回当前二叉树的最大值
	int  GetMinValue();				//返回当前二叉树的最小值
	void Delete(T value);			//删除该元素
private:
	TreeNode<T> *insert(TreeNode<T> *root, T value ); //内部插入实现
	TreeNode<T> *deleteval(TreeNode<T> *node, T val); //删除某个元素
	TreeNode<T> *FindMin(TreeNode<T> *node);          //找到最小的元素的结点
	TreeNode<T> *FindMax(TreeNode<T> *node);          //找到最大的元素的结点
	T getmaxvalue(TreeNode<T> *node);
	T getminvalue(TreeNode<T> *node);
	void inorder(TreeNode<T> *node);                //内部中序遍历
	TreeNode<T> *Tree;
	int size;
};
template<class T>
inline BST<T>::BST()
{
	this->size = 0;
	this->Tree = NULL;
}
//往BST树中插入数据
template<class T>
inline void BST<T>::Insert(T value)
{
	this->Tree = insert(Tree, value);
}
template<class T>
inline TreeNode<T> * BST<T>::insert(TreeNode<T> *node, T value)
{
	if (node == NULL)
	{
		size++;
		return new TreeNode<T>(value);
	}
	else {
		if (value < node->val)
		{
			node->left = insert(node->left, value);
			return node;
		}
		else if (value > node->val)
		{
			node->right = insert(node->right, value);
			return node;
		}
	}
}
//获取当前二叉树的所有非空结点
template<class T>
inline int BST<T>::GetSize()
{
	return this->size;
}
template<class T>
inline int BST<T>::GetMaxValue()
{
	return this->getmaxvalue(Tree);
}
template<class T>
inline int BST<T>::GetMinValue()
{
	return this->getminvalue(Tree);
}
template<class T>
inline void BST<T>::Delete(T value)
{
	Tree = this->deleteval(Tree, value);
	this->size--;
}
//中序遍历
template<class T>
inline void BST<T>::InOrder()
{
	inorder(Tree);
}
template<class T>
inline void BST<T>::inorder(TreeNode<T> *node)
{
	if (node != NULL)
	{
		inorder(node->left);
		cout << node->val << " ";
		inorder(node->right);
	}
}
template<class T>
inline TreeNode<T> * BST<T>::deleteval(TreeNode<T>* node, T val)
{
	if (node == NULL)cout << "未找到此元素" << endl;
	TreeNode<T> *tmp = new TreeNode<T>;
	if (val < node->val)
		node->left = deleteval(node->left, val);
	else if(val > node->val)
		node->right = deleteval(node->right, val);
	else {
		if (node->left != NULL && node->right != NULL) //存在左右子树
		{
			tmp = this->FindMin(node->right);
			node->val = tmp->val;
			node->right = deleteval(node->right, node->val);
		}
		else { //叶子结点或者只有一个子节点
			tmp = node;
			if (!node->left)
				node = node->right;
			else if (!node->right)
				node = node->left;
			free(tmp);
		}
	}
	return node;
}
template<class T>
inline TreeNode<T>* BST<T>::FindMin(TreeNode<T>* node)
{
	if (node->left == NULL)return node;
	else return FindMin(node->left);
}
template<class T>
inline TreeNode<T>* BST<T>::FindMax(TreeNode<T>* node)
{
	if (node->right == NULL)return node;
	else return FindMax(node->right);
}
template<class T>
inline T BST<T>::getmaxvalue(TreeNode<T> *node)
{
	//如果当前结点的左子树为空树,则当前结点就是最大值
	if (node->right == NULL)
		return node->val;
	else return getmaxvalue(node->right);
}
template<class T>
inline T BST<T>::getminvalue(TreeNode<T> *node)
{
	if (node->left == NULL)
		return node->val;
	else return getminvalue(node->left);
}
测试代码
#include <istream>
#include "BST.h"
using namespace std;
int main()
{
	BST<int> bt;
	int arr[] = { 9,5,3,4,1,7,2,8,0 };
	int n = sizeof(arr) / sizeof(int);
	for (int i = 0; i < n; i++)
		bt.Insert(arr[i]);
	bt.InOrder();
	cout << endl << bt.GetSize() << endl;
	cout << "这组元素中的最大值为:" <<bt.GetMaxValue() << endl;
	cout << "这组元素中的最小值为:" <<bt.GetMinValue() << endl;
	cout << "输入你想删除任意一个元素" << endl;
	int x = 0;
	cin >> x;
	bt.Delete(x);
	bt.InOrder();
	cout << "此时该集合内的元素个数为:" << bt.GetSize() << endl;
	system("pause");
	return 0;
}
数据结构 - 二叉搜索树封装 C++的更多相关文章
- 数据结构-二叉搜索树(BST binary search tree)
		本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/ 二叉搜索树简介 顾名思义,二叉搜索树是以一棵二叉树来组织的,这样的一棵树可以用一个链表数据结构来 ... 
- 数据结构-二叉搜索树的js实现
		一.树的相关概念 1.基本概念 子树 一个子树由一个节点和它的后代构成. 节点的度 节点所拥有的子树的个数. 树的度 树中各节点度的最大值 节点的深度 节点的深度等于祖先节点的数量 树的高度 树的高度 ... 
- 数据结构☞二叉搜索树BST
		二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它可以是一棵空树,也可以是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它 ... 
- 基本数据结构 —— 二叉搜索树(C++实现)
		目录 什么是二叉搜索树 二叉搜索树如何储存数值 二叉搜索树的操作 插入一个数值 查询是否包含某个数值 删除某个数值 测试代码 参考资料 什么是二叉搜索树 二叉搜索树(英语:Binary Search ... 
- 数据结构---二叉搜索树BST实现
		1. 二叉查找树 二叉查找树(Binary Search Tree),也称为二叉搜索树.有序二叉树(ordered binary tree)或排序二叉树(sorted binary tree),是指一 ... 
- 数据结构-二叉搜索树和二叉树排序算法(python实现)
		今天我们要介绍的是一种特殊的二叉树--二叉搜索树,同时我们也会讲到一种排序算法--二叉树排序算法.这两者之间有什么联系呢,我们一起来看一下吧. 开始之前呢,我们先来介绍一下如何创建一颗二叉搜索树. 假 ... 
- Java数据结构——二叉搜索树
		定义二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若 ... 
- 数据结构——二叉搜索树(Binary Search Tree)
		二叉树(Binary Tree)的基础下 每个父节点下 左节点小,右节点大. 节点的插入: 若root==NULL则root=newnode 否则不断与节点值比较,较小则向左比较,较大则向右比较. 完 ... 
- 数据结构-二叉搜索树Java实现
		1,Node.java 生成基础二叉树的结构 package com.cnblogs.mufasa.searchTree; /** * 节点配置父+左+右 */ public class Node{ ... 
随机推荐
- [LeetCode] 105. Construct Binary Tree from Preorder and Inorder Traversal 由先序和中序遍历建立二叉树
			Given preorder and inorder traversal of a tree, construct the binary tree. Note:You may assume that ... 
- win10安装docker并结合Idea2018.1部署springboot项目
			一.准备工作 1..工具:win10,idea2018,maven3.5,jdk8 二.win10安装docker 1.win10安装docker:http://www.runoob.com/dock ... 
- oracle 错误 TNS-01190与oracle 登入没反应操作
			1,问题描述 [oracle@node2 ~]$ lsnrctl stop LSNRCTL - Production on -MAY- :: Copyright (c) , , Oracle. All ... 
- Dictionary不可以迭代修改值
			var buffer = new List<string>(showDict.Keys); foreach (var key in buffer) { if (showDict[key] ... 
- swagger2 导出离线Word/PDF/HTML文档
			swagger2离线导出Word/PDF/HTML文档 1.前言 通过前面的两篇博客 我们已经介绍了如何使用spring boot整合swagger2 生成在线的API文档. 但是某些情况下,我们需要 ... 
- windows远程桌面无法拷贝文件的问题与解决方法
			在开发完往windows服务器上部署系统或者给系统打补丁的时候,都会需要远程桌面的双向拷贝文件功能. 但是有些时候却会发现没有办法拷贝文件,原因主要有两个. 01 远程桌面的剪贴板设置 一个是在远程桌 ... 
- @Bean修饰的方法参数的注入方式
			@Bean修饰的方法参数的注入方式: 方法参数默认注入方式为Autowired,即先根据类型匹配,若有多个在根据名称进行匹配. 1:复杂类型可以通过@Qualifier(value=“XXX”)限定; ... 
- 我自己整理的 Linux 常用命令
			1.查看文件安装路径: 由于软件安装的地方不止一个地方,所有先说查看文件安装的所有路径(地址). 这里以 xsp 为例.比如说我安装了xsp,但是不知道文件都安装在哪些地方.放在哪些文件夹里,可以用下 ... 
- MySQL 只能做小项目?松哥要说几句公道话!
			松哥上学那会,很多人对 MySQL 有一些偏见,偏见主要集中在以下几方面: MySQL 不支持事务(事实上 MyISAM 有表锁,但是效率比较低) MySQL 存储的数据量比较小,适合小项目,大项目还 ... 
- centos切换php版本
			centos服务器上安装了php5.3到php7.2版本的php,默认使用php -v,查看到的php版本信息为: 修改环境变量文件:vim /etc/profile shift+g跳转到最后一行环境 ... 
