首页 > 其他分享 >二叉搜索树

二叉搜索树

时间:2023-01-11 18:14:31浏览次数:44  
标签:cnt return val int 二叉 搜索 节点

性质

二叉搜索树是一种具有以下性质的树:

  1. 如果左子树不为空的话,左子树的所有节点的值都小于根节点的值
  2. 如果右子树不为空的话,右子树的所有节点的值都大于根节点的值
  3. 他的左右子树也都是二叉搜索树

下面就是一棵二叉搜索树

image

操作

二叉搜索树在一般的情况下都可以较为高效的完成一些操作,但在特殊情况下会退化成链。

二叉搜索树中的一个点代表的值可以是多个相同值的点的一个整体,也就是说,每一个值可能有重复的,但二叉搜索树里面不会有重复的,如果重复只需要在计数器上加一即可,这样也可以省空间,

下面以平衡树的模板题为例

查找

从根节点开始找,如果当前点的值就是要查找的值,那么就返回当前点的编号。
如果当前点的值大于要找的值,就去左子树去找。
如果当前点的值小于要找的值,就去右子树去找。

代码实现的话很简单,注意别打错下标就好,因为题目里面没有这个操作所以不放代码了。

插入

当你想要插入某一个值 k 的时候,操作和查找是差不多的,因为你要插入的话要先找到 k 插入的位置,当有点的值和 k 相等时,可以直接当前值的点数加一,反之开一个新点,然后就就是根据 k 和当前点的大小来判断是往哪里插入。

代码实现

void add(int &x,int k)
{
	if(x==0)
	{
		x=++cnt;
		e[x].siz=e[x].cnt=1;
		e[x].val=k;
		return ;
	}
	if(e[x].val==k)
	{
		e[x].cnt++;
		e[x].siz++;
		return ;
	}
	if(e[x].val<k)
	{
		add(rs1,k);
		p_p(x);
		return ;
	}
	if(e[x].val>k)
	{
		add(ls1,k);
		p_p(x);
		return ;
	}
	return ;
}

删除

我们可以先找到当前节点。如果左子树为空,就把右子树提上来,如果右子树为空,就把左子树提上来。否则,删去右子树最小的节点(这个节点的左子树一定为空),把这个节点移动到当前节点的位置上来。

代码实现

int fid(int &x)
{
	if(e[x].ls)
	{
		int res=fid(ls1);
		p_p(x);
		return res;
	}
	int res=x;
	x=e[x].rs;
	return res;
}
void dele(int &x,int k)
{
	if(e[x].val==k)
	{
		if(e[x].cnt>1)
		{
			e[x].cnt--;
			e[x].siz--;
			return ;
		}
		else
		{
			if(e[x].ls==0)
			{
				x=rs1;
				return ;
			}
			if(e[x].rs==0)
			{
				x=ls1;
				return ;
			}
			else
			{
				int xx=fid(rs1);
				e[x].val=e[xx].val;
				e[x].cnt=e[xx].cnt;
				p_p(x);
				return ;
			}
		}
	}
	if(e[x].val<k)
	{
		dele(rs1,k);
		p_p(x);
		return ;
	}
	if(e[x].val>k)
	{
		dele(ls1,k);
		p_p(x);
		return ;
	}
	return ;
}

查询排名

首先如果要是 k 刚好是在当前点的排名上,也就是 k==e[x].val的话,我们可以直接
我们还是和之前一样,如果当前要查询的 k 的排名是大于当前点的排名,也就是 k>e[e[x].ls].siz+1 的话

插曲

x=++cnt打成x==++cnt调了1个多小时。。。
image

查询排名和值的时候把if里的k>=e[p].val打成了k>=e[x].val,半个小时

image

标签:cnt,return,val,int,二叉,搜索,节点
From: https://www.cnblogs.com/Multitree/p/17044560.html

相关文章

  • pdd商品列表接口,PDD商品详情接口,关键词搜索pdd商品接口代码展示
    前言item_search-根据关键词取商品列表接口,可以通过关键词搜索请求接口拿到商品列表页面的商品标题,商品价格,商品优惠价,商品视频,商品图片,商品sku属性,商品sku属性描述,发货地,库......
  • 代码随想录 Day15 LeetCode102. 二叉树的层序遍历
    102.二叉树的层序遍历classSolution{public:vector<vector<int>>levelOrder(TreeNode*root){vector<vector<int>>result;queue<TreeNode*......
  • 【BFS】LeetCode 103. 二叉树的锯齿形层序遍历
    题目链接103.二叉树的锯齿形层序遍历思路1额外加一个栈来使得访问节点的顺序是逆序的代码1classSolution{publicList<List<Integer>>zigzagLevelOrder(Tree......
  • 直播软件app开发,删除主页搜索框
    直播软件app开发,删除主页搜索框packages/apps/Launcher3/src/com/android/launcher3/Launcher.java增加函数isQsbDisabled,用于判断是否删除搜索栏,修改返回值即可设置......
  • 输出二叉树的右视图
    题目要求题目链接思路分析方法一:刚开始做的时候没有什么思路,就采用了最笨的方法根据中序和先序求出二叉树得到层序遍历的结果得到每一层的最后一个元素方法比较笨......
  • 543. 二叉树的直径
    题目给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。注意:两结点之间的路径长度......
  • 算法刷题 Day 14 | 二叉树的递归遍历
    今日内容:理论基础递归遍历迭代遍历统一迭代详细布置理论基础需要了解二叉树的种类,存储方式,遍历方式以及二叉树的定义文章讲解:https://programm......
  • 35. 搜索插入位置
    问题链接https://leetcode.cn/problems/search-insert-position/description/解题思路搜索插入位置,是一个常见的二分算法。二分是有固定模板的。这个题目是搜索插入位......
  • 重建二叉树
    题目描述思路分析在中序遍历列表中找到先序遍历列表中第一个节点,以此为界限可以将二叉树分为左右子树,可以得知左子树和右子树的长度,在先序遍历列表中划分出来。再依次拿......
  • 二叉搜索树的最近公共祖先
    题目描述给定一个二叉搜索树,找到该树中两个指定节点的最近公共祖先。1.对于该题的最近的公共祖先定义:对于有根树T的两个节点p、q,最近公共祖先LCA(T,p,q)表示一个节点x......