二叉搜索树

一棵二叉树,可以为空;如果不为空,满足以下性质:
1. 非空左子树的所有键值小于其根结点的键值。
2. 非空右子树的所有键值大于其根结点的键值。
3. 左、右子树都是二叉搜索树。

二叉搜索树的插入,删除,查找

头文件

#include "iostream"
#include "string.h"
#include "sstream"using namespace std;//二叉查找树节点信息
template<class T>
class TreeNode
{
public:TreeNode():lson(NULL),rson(NULL),freq(1){}//初始化T data;//值unsigned int freq;//频率TreeNode* lson;//指向左儿子的坐标TreeNode* rson;//指向右儿子的坐标
};//二叉查找树类的属性和方法声明
template<class T>
class BST
{
private:TreeNode<T>* root;//根节点void insertpri(TreeNode<T>* &node,T x);//插入TreeNode<T>* findpri(TreeNode<T>* node,T x);//void insubtree(TreeNode<T>* node);//中序遍历void Deletepri(TreeNode<T>* &node,T x);//删除TreeNode<T>* findMinpri(TreeNode<T>* node);TreeNode<T>* findMaxpri(TreeNode<T>* node);
public:BST():root(NULL){}void insert(T x);//插入接口TreeNode<T>* find(T x);//查找接口void Delete(T x);//删除接口void traversal();//遍历接口TreeNode<T>* findMin();TreeNode<T>* findMax();};

实现

#include "head.h"template<class T>
void BST<T>::insertpri(TreeNode<T>* &node,T x)
{if(node==NULL)//如果节点为空,就在此节点处加入x信息{node=new TreeNode<T>();node->data=x;//cout<<x;return;}if (node->data>x){insertpri(node->lson,x);}else if (node->data<x){insertpri(node->rson,x);}else{node->freq++;}}//插入接口
template<class T>
void BST<T>::insert(T x)
{insertpri(root,x);
}template<class T>
TreeNode<T>* BST<T>::findpri(TreeNode<T>* node,T x)
{if (node==NULL){return NULL;}if (node->data>x){return findpri(node->lson);}else if (node->data<x){return findpri(node->rson);}else{return node;}
}template<class T>
TreeNode<T>* BST<T>::find(T x)
{return findpri(root,x);
}template<class T>
TreeNode<T>* BST<T>::findMinpri(TreeNode<T>* node)
{if (node==NULL){return NULL;}if (node->lson!=NULL){return findMinpri(node->lson);}else{return node;}
}template<class T>
TreeNode<T>* BST<T>::findMin()
{return findMinpri(root);
}template<class T>
void BST<T>::Deletepri(TreeNode<T>* &node,T x)
{if(node==NULL) return ;//没有找到值是x的节点if(x < node->data)Deletepri(node->lson,x);//如果x小于节点的值,就继续在节点的左子树中删除xelse if(x > node->data)Deletepri(node->rson,x);//如果x大于节点的值,就继续在节点的右子树中删除xelse//如果相等,此节点就是要删除的节点{if(node->lson&&node->rson)//此节点有两个儿子{TreeNode<T>* temp=node->rson;//temp指向节点的右儿子while(temp->lson!=NULL) temp=temp->lson;//找到右子树中值最小的节点//把右子树中最小节点的值赋值给本节点node->data=temp->data;node->freq=temp->freq;Deletepri(node->rson,temp->data);//删除右子树中最小值的节点}else//此节点有1个或0个儿子{TreeNode<T>* temp=node;if(node->lson==NULL)//有右儿子或者没有儿子node=node->rson;else if(node->rson==NULL)//有左儿子node=node->lson;delete(temp);}}return;}template<class T>
void BST<T>::Delete(T x)
{Deletepri(root,x);
}//中序遍历函数
template<class T>
void BST<T>::insubtree(TreeNode<T>* node)
{if(node==NULL) return;insubtree(node->lson);//先遍历左子树cout<<node->data<<" ";//输出根节点insubtree(node->rson);//再遍历右子树
}
//中序遍历接口
template<class T>
void BST<T>::traversal()
{insubtree(root);
}int main()
{BST<int>* bst=new BST<int>();int temp;int inputNumber;cout<<"1.插入数据\n2.查找数据\n3.查找最小\n4.删除指定数据\n5.中序遍历\n";bst->insert(66);bst->insert(55);bst->insert(77);bst->insert(44);while (true){cout<<"请输入指令\n";cin>>temp;switch (temp){case 1:cin>>inputNumber;bst->insert(inputNumber);break;case 2:break;case 3:cout<<"结果为:";cout<<bst->findMin()->data;break;case 4:cin>>inputNumber;bst->Delete(inputNumber);break;case 5:bst->traversal();break;default:break;}}system("pause");return 0;}

参考链接

一步一步写二叉查找树 - C小加 - C++博客

效果如下

数据结构之二叉搜索树相关推荐

  1. 数据结构之二叉搜索树(BST)

    数据结构之二叉搜索树(BST) 1. 二叉搜索树定义 二叉搜索树(Binary Search Tree),又名二叉排序树(Binary Sort Tree). 二叉搜索树是具有有以下性质的二叉树: ( ...

  2. 【数据结构】二叉搜索树的python实现

    [数据结构]二叉搜索树的python实现 二叉搜索树是以二叉树来组织的,对于一个二叉搜索树的节点,其左子树节点的元素值都不大于该节点元素值,其右子树节点的元素值都不小于该节点的元素值. 首先定义一个初 ...

  3. 请回答数据结构【二叉搜索树】

    请回答数据结构[二叉搜索树] 1. BinarySearchTree(二叉排序树) 1.0 Intro 1.1 concept 2. 二叉搜索树快速入门 2.1 查找 2.2 BSTree应用 3. ...

  4. 数据结构之二叉搜索树/二叉查找数/有序二叉树/排序二叉树

    概念~ 二叉查找树(英语:Binary Search Tree),也称二叉搜索树.有序二叉树(英语:ordered binary tree),排序二叉树(英语:sorted binary tree), ...

  5. 数据结构:二叉搜索树(BST)的基本操作

    概述 学习过数据结构的童鞋都应该知道,对树的操作是一些最基本的技能(本文是对后面要写B树.B-树.B+树的一个前导,已经熟悉的朋友可以跳过了).而在树结构中,二叉树又是最基础的.虽然这些知识是比较基础 ...

  6. 08_Python算法+数据结构笔记-二叉搜索树查询/删除-AVL树旋转/插入/应用-贪心算法

    b站视频:路飞IT学城 清华计算机博士带你学习Python算法+数据结构_哔哩哔哩_bilibili #71 二叉搜索树:查询 import randomclass BiTreeNode:def __ ...

  7. 【数据结构】二叉搜索树的实现

    目录 一.二叉搜索树的概念 二.二叉搜索树的中序遍历用于排序+去重 三.二叉搜索树的查找 1.查找的非递归写法 2.查找的递归写法 四.二叉搜索树的插入 1.插入的非递归写法 2.插入的递归写法 五. ...

  8. 数据结构 - 从二叉搜索树说到AVL树(一)之二叉搜索树的操作与详解(Java)

    二叉搜索树(Binary Search Tree),简称BST,顾名思义,一颗可以用于搜索的二叉树.BST在数据结构中占有很重要的地位,一些高级树结构都是其的变种,例如AVL树.红黑树等,因此理解BS ...

  9. js遍历树节点下的所有子节点_「Javascript数据结构」× 二叉搜索树

    目录 树的相关术语 二叉树和二叉搜索树 二叉树的遍历 二叉搜索树的搜索 二叉搜索树的移除 「 树的相关术语 」 一个树结构包含一些列存在父子关系的节点.每个节点都有一个父节点(除了顶部的第一个节点)以 ...

最新文章

  1. NYOJ 625 笨蛋的难题(二)
  2. 分类系列之感知器学习算法PLA 和 口袋算法Pocket Algorithm
  3. 小白学习Java技术知识点总结,其实学习Java没那么难
  4. 精选| 2020年12月R新包推荐(第49期)
  5. SpringBoot 如何进行对象复制,老鸟们都这么玩的!
  6. PAT Practice [1020 月饼]
  7. Tomcat优化大全,进来看了,真就会了
  8. IPSAN与FCSAN存储结构的区别
  9. 练习4-11 统计素数并求和
  10. 影响中国信息化全面预算管理的十大案例
  11. linux系统安装firefox的flash player插件
  12. Prove the EXACT 4SAT is NP-complete.
  13. Python selenium模块对网页进行截屏保存图片 easyocr模块识别提取图片文字
  14. 51单片机之共阳极静态数码管
  15. 人人商城 重复授权问题
  16. 【MySQL】34道SQL综合练习详解(员工表、部门表、工资等级表)
  17. 手把手教你抄写URP——3——自发光材质
  18. AD入门学习—元件库(原理图库)的创建
  19. 安信可ESP8266、ESP32、ESP32-S2、ESP32-C3模组的TCP_UDP吞吐量测试使用指导
  20. MySQL架构与业务总结图

热门文章

  1. 知识图谱论文阅读(十六)【WWW2019】Knowledge Graph Convolutional Networks for Recommender
  2. 李宏毅机器学习(七)GPT的野望
  3. 卷积神经网络中十大令人拍案叫绝的操作
  4. 论文浅尝 | GraphSAINT—基于图采样的归纳学习方法
  5. Android控件默认风格解析之SeekBar
  6. 一篇文章学习Python中的多线程
  7. TypeError: can't pickle _thread.RLock objects
  8. Docker添加或者更改容器的端口映射
  9. ASP.NET MVC教程四:ASP.NET MVC中页面传值的几种方式
  10. Centos7搭建Redis,同一服务器启动两个端口的Redis