数据结构 - 二叉搜索树封装 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{ ...
随机推荐
- Postman测试后台使用@RequestBody接收参数的坑
问题原因:我在使用PostMan测试接口时发现数据传递不过来,是因为请求体定义为JSON数据,自动就传递不过来,虽然问题简单,但由于之前这个用的较少,所以就忽略了这点. 解决问题链接:https:// ...
- 强大的Scala模式匹配
用过Scala的模式匹配,感觉Java的弱爆了.Scala几乎可以匹配任何数据类型,如果默认的不能满足你的要求,你可以自定义模式匹配. 介绍Scala的模式匹配前,我们先了解清楚unapply()与u ...
- c#中怎样取得某坐标点的颜色
// x,y 分别为x轴,y轴坐标 返回System.Drawing.Color 可以直接显示 public System.Drawing.Color GetPixelColor(int x, int ...
- Azure DevOps Server 经验分享(国内重型工程公司)
受邀在上海为国内著名的重型工程公司的软件研发团队分享了Azure DevOps Server 的经验. http://www.cnblogs.com/danzhang/ DevOps MVP 张洪君 ...
- Beta冲刺(8/7)——2019.5.30
作业描述 课程 软件工程1916|W(福州大学) 团队名称 修!咻咻! 作业要求 项目Beta冲刺(团队) 团队目标 切实可行的计算机协会维修预约平台 开发工具 Eclipse 团队信息 队员学号 队 ...
- python多条插入问题
多条插入用excutemany(listtuple) #coding=utf-8 import MySQLdb import traceback sqlstr= "insert into t ...
- WPF DataGrid 自定义样式 MVVM 删除 查询
看到很多小伙伴在找Dategrid样式 就分享一个 ,有不好的地方 请指出 代码部分都加了注释 需要的可以自己修改为自己需要的样式 源码已经上传 地址: https://github.com/YC ...
- log4j打印抛出异常时堆栈内容
JAVA 中为快速定位,抛出异常的位置.往往需要在日志中描述. log.err("异常出错点", e); 会将出错时的堆栈信息显示出来. package com.jqyc.jase ...
- pytest_demo_实战1
1.根目录配置 pytest.ini [pytest] addopts = -p no:warnings 2.更改运行手势,系统配置 file -> setting -> Tools -& ...
- UAVStack JVM监控分析工具:图形化展示采集及分析监控数据
摘要:UAVStack推出的JVM监控分析工具提供基于页面的展现方式,以图形化的方式展示采集到的监控数据:同时提供JVM基本参数获取.内存dump.线程分析.内存分配采样和热点方法分析等功能. 引言 ...