当前位置: 首页 > article >正文

二叉搜索树(附源码C++)

游凡/搜索二叉树icon-default.png?t=O83Ahttps://gitee.com/you-fan-a/search-binary-tree

一、什么是二叉搜索树?

  • 若它的左子树不空,则左子树上所有结点的值均小于它根结点的值。
  • 若它的右子树不空,则右子树上所有结点的值均大于它根结点的值。
  • 它的左、右树又分为⼆叉排序树

简记:“左小,右大

举例:

 此我们对这棵树进行中序遍历,就可以得到:1、3、6、8、10

二叉树的插入代码:

bool Insert(const K& key, const V& value)
{
	if (_root == nullptr)
	{
		_root = new Node(key, value);
	}
	else
	{
		Node* parent = _root;
		Node* child = _root;
		while (child)
		{
			if (key < child->_key)
			{
				parent = child;
				child = parent->_left;
			}
			else if(key>child->_key)
			{
				parent = child;
				child = parent->_right;
			}
			else
			{
				return false;
			}
		}
		
		child = new Node(key, value);
		if (key < parent->_key)
		{
			parent->_left = child;
		}
		else if(key>parent->_key)
		{
			parent->_right = child;
		}
	}
	return true;
}

二、二叉树的查找

二叉树的查找也十分简单,就是比大小:

代码:

Node* Find(const K& key)
{
	Node* parent = _root;
	Node* child = _root;
	while (child)
	{
		if (key < child->_key)
		{
			parent = child;
			child = parent->_left;
		}
		else if (key > child->_key)
		{
			parent = child;
			child = parent->_right;
		}
		else
		{
			return child;
		}
	}
	return nullptr;
}

三、二叉树的删除

删除有三种情况:1、删除的节点为叶子节点。

                             2、删除的节点有一个孩子

                             3、删除的节点有两个孩子

1、第一种情况最好处理,直接删就行

2、第二种情况需要删除指定节点后再把后面的节点链接上

3、第三种情况需要一种特殊的删除放方法

左子树的最右值或右子树的最左值,记为x,把指定要删除的节点的值替换为x,然后删除x。

(最左和最右是物理位置上的最左和最右)

例子1:

例子2:


http://www.kler.cn/news/315038.html

相关文章:

  • 将sqlite3移植到开发板上
  • frp内网穿透部署
  • vue一级、二级路由设计
  • 论文阅读-Demystifying Misconceptions in Social Bots Research
  • Ubuntu20.04 搜索不到任何蓝牙设备
  • 【SpringCloud】优雅实现远程调用 - OpenFeign
  • 鸿蒙【项目打包】- .hap 和 .app;(测试如何安装发的hap包)(应用上架流程)
  • 二二复制模式小程序商城开发
  • Python中的IPython:交互式的Python shell
  • 算法题之宝石与石头
  • 微服务、云计算、分布式开发全套课程课件,来原于企培和多年大厂工作提炼
  • el-form动态标题和输入值,并且最后一个输入框不校验
  • Python 课程16-OpenCV
  • C++门迷宫
  • C++高精度计时方法总结(测试函数运行时间)
  • Axios基本语法和前后端交互
  • 【数据结构】排序算法---计数排序
  • Cpp类和对象(中续)(5)
  • Rasa对话模型——做一个语言助手
  • Qt窗口——QToolBar
  • JVM常见面试题(三):类加载器,双亲委派模型,类装载的执行过程
  • python中ocr图片文字识别样例(二)
  • Spring MVC设置请求头和响应头的Header
  • Unity DOTS物理引擎的核心分析与详解
  • 植物大战僵尸【源代码分享+核心思路讲解】
  • [每日一练]MySQL中的正则表达式的应用
  • Day 9:1306 跳跃游戏III
  • 神经网络构建原理(以MINIST为例)
  • Java | Leetcode Java题解之第416题分割等和子集
  • 国内可以使用的ChatGPT服务【9月持续更新】