二叉搜索树之:【BST】【基本应用汇合】
Ⅰ 索树BST与平衡树Treap的区别,已经BST的基本功能介绍
二叉搜索树之:【二叉搜索树与平衡树的区别】【BST和treap的区别】_bei2002315的博客-CSDN博客
Ⅱ 二叉搜索树的基本大纲
Ⅲ 二叉搜索树的建立
①基础版本建树也分两种形式:
❶ l [ ],r [ ]版本 ❷ node结构体版本
具体的应用在链接:
二叉搜索树之:【实现找某个节点的后继】【二叉搜索树的性质】_bei2002315的博客-CSDN博客
细节补充:
②此处是最基础版本的建树,因为是根据任意序列建树,
更详细的建树方式(根据某序列,比如前序,中序,后序),
以及三种节点生成方式的对比。 在链接:
二叉搜索树之:【中序遍历和前序遍历互帮互助建立BST】【Node 版本建树方式】【BST的两种存储节点的方式的对比】_bei2002315的博客-CSDN博客
/*根据给定任意的序列a[],建立一棵二叉搜索树
*/#include <bits/stdc++.h>
using namespace std;
const int N=1010,inf=1e9;
int a[N];
int root,idx; //二叉树必备变量 struct Node
{int l,r;int key;int siz;
}tr[N];//BST标志性函数 1
int get_node(int key)
{tr[++idx].key=key;tr[idx].siz=1;return idx;
} //BST标志性函数 2
/*BST如果要维护子树的东西来更新每一个节点,比如siz,
就必须有这个标志性函数
*/
void pushup(int u)
{tr[u].siz=tr[tr[u].l].siz+tr[tr[u].r].siz+1;
} //建立空树
void build()
{get_node(-inf),get_node(-inf);root=1;tr[root].r=2;pushup(root);
} void insert(int &u,int key) //与根节点不断比计较大小递归插入的过程
{if(!u) //当前递归到的根节点u是空位,就把key插入 {u=get_node(key);}else if(key<tr[u].key) //比根节点的数值小 {insert(tr[u].l,key);}else if(key>tr[u].key) //比根节点的数值大 {insert(tr[u].r,key);}else if(key==tr[u].key) //与根节点的数值一样大 {return;}pushup(u);
}int main()
{int n;cin>>n;//step1:build()建立一棵空树build(); //step2:读入序列for(int i=1;i<=n;i++){cin>>a[i];} //step3:插入数据 for(int i=1;i<=n;i++){insert(root,a[i]);} return 0;
}
Ⅳ BST的子节点变量维护 ,insert()已经把子节点维护的东西
初始化好了(联合pushup函数更新),相当于以前的siz[]数组用
dfs()初始化。
void pushup(int u)
{tr[u].siz=tr[tr[u].l].siz+tr[tr[u].r].siz+1;
} //建立空树
void build()
{get_node(-inf),get_node(-inf);root=1;tr[root].r=2;pushup(root);
} void insert(int &u,int key) //与根节点不断比计较大小递归插入的过程
{if(!u) //当前递归到的根节点u是空位,就把key插入 {u=get_node(key);}else if(key<tr[u].key) //比根节点的数值小 {insert(tr[u].l,key);}else if(key>tr[u].key) //比根节点的数值大 {insert(tr[u].r,key);}else if(key==tr[u].key) //与根节点的数值一样大 {return;}pushup(u);
}
Ⅴ BST的基本应用
①BST的深搜,用节点维护的信息(比如siz) 进行组合运算
(根据IV可知,每个节点的siz在建树操作的时候就已经初始化完成了)
比如说下面这道省赛题目:
Contest 1013 problem (csgrandeur.cn)
l 变量代表的是左子树的计算返回值
r 变量代表的是右子树的计算返回值
利用左右子树的计算返回值,计算出当前以u为根节点子树的计算返回值
并return 该值
这个部分与之前邻接表存储的深搜大不相同:
①之前用邻接表存储的,只需要计算 j =ne[i] 的单独 j 变量为根节点的子树的返回值
②此处存左右孩子的存储方式,要分别计算以左右孩子为根节点的子树的返回值,
用l,r分别表示这两个返回值
② BST的遍历之------已知前序遍历和后序遍历,求层序遍历
学习新的建树方式,类似于开两个数组 l[] , r[],存左右孩子
1497. 树的遍历 - AcWing题库
更完善的题解链接:
二叉搜索树之:【中序遍历和后序遍历互帮互助建立BST】【BST的层序遍历(BFS搜索序)】【新的建树方式】【非结构体,l[],r[]建树法】【不断确定根节点,直到建立整棵树】_bei2002315的博客-CSDN博客
#include <bits/stdc++.h>
using namespace std;
const int N=40;
int postorder[N],inorder[N]; //定义后序遍历数组和中序遍历数组
int n; //点的数量//l是指每个点的左儿子是谁,r是指每个点的右儿子是谁,pos是哈希表
unordered_map<int,int> l,r,pos;/*既然每次递归都要利用当前小序列的前序序列和后序序列,所以参数存储(il,ir) -----中序序列的前后端点(pl,pr) -----后序序列的前后端点
*/
int build(int il,int ir,int pl,int pr)
{int root=postorder[pr]; //从后序序列中提取出根节点int k=pos[root]; //从哈希表中找出root的位置if(il<k) //说明左子树存在l[root]=build(il,k-1,pl,k-1-il+pl); //根节点的左儿子应该是左子树去递归返回的根节点if(ir>k) //说明右子树存在r[root]=build(k+1,ir,k-1-il+pl+1,pr-1);return root;
}void bfs(int root)
{queue<int> q;q.push(root);while(q.size()){auto t=q.front();q.pop();cout<<t<<" ";if(l.count(t)) //如果t存在左孩子{q.push(l[t]);}if(r.count(t)) //如果存在右孩子{q.push(r[t]);}}
}int main()
{cin>>n;for(int i=0;i<n;i++){cin>>postorder[i]; }for(int i=0;i<n;i++){cin>>inorder[i];pos[inorder[i]]=i;}int root=build(0,n-1,0,n-1);bfs(root);return 0;
}
③BST的特定序列(前中后)三种建树方式之:------------ l[ ],r[ ] 版本建树,和Node两种版本的建树
二叉搜索树之:【中序遍历和前序遍历互帮互助建立BST】【Node 版本建树方式】【BST的两种存储节点的方式的对比】_bei2002315的博客-CSDN博客
④BST的任意序找某个节点的后继节点:---------------两种版本建树
二叉搜索树之:【实现找某个节点的后继】【二叉搜索树的性质】_bei2002315的博客-CSDN博客
⑤BST中序遍历方式,之前学的是层序遍历,此处是中序遍历
二叉搜索树之:【中序遍历一棵二叉搜索树】【给一棵有固定形态的二叉搜索树填值】【用BST中序遍历的性质填值】【之前讲过层序遍历】_bei2002315的博客-CSDN博客
⑥BST的深搜遍历方式---------从根节点到叶子节点的一条完整路径
二叉搜索树之:【深搜遍历二叉搜索树】【dfs】【了解二叉树深搜递归的边界:叶子节点(左右儿子都为空的是叶子节点)】【力扣上面类型题目写法的总结】_bei2002315的博客-CSDN博客
⑦BST的考研写法(指针,开辟空间)-----------三种遍历方式
二叉搜索树之:【BST】【基本应用汇合】相关推荐
- 数据结构之二叉搜索树(BST)
数据结构之二叉搜索树(BST) 1. 二叉搜索树定义 二叉搜索树(Binary Search Tree),又名二叉排序树(Binary Sort Tree). 二叉搜索树是具有有以下性质的二叉树: ( ...
- 中根遍历二叉查找树所得序列一定是有序序列_二叉搜索树(BST)
点击上方"蓝字",发现更多精彩. 前面我们介绍了树的基本概念,并引出了二叉树.值得注意的是,无特征的二叉树在工程上几乎没啥用处,一般都是使用bst.avl,trie,rbtree等 ...
- 二叉搜索树的删除操作可以交换吗_JavaScript数据结构 — 二叉搜索树(BST)ES6实现...
1. 概述 最基本的数据结构是向量和链表,为了将二者的优势结合起来,我们引入了二叉树,可以认为二叉树是列表在维度上的拓展.而今天要介绍的二叉搜索树(BST)则是在形式上借鉴了二叉树,同时也巧妙借鉴了有 ...
- 深入理解二叉搜索树(BST)
一棵二叉搜索树(BST)是以一棵二叉树来组织的,可以用链表数据结构来表示,其中,每一个结点就是一个对象,一般地,包含数据内容key和指向孩子(也可能是父母)的指针属性.如果某个孩子结点不存在,其指针属 ...
- 二叉搜索树(BST)——基本概念及基本实现代码
二叉搜索树(BST)--基本概念及基本实现代码 1.二叉搜索树概念 二叉搜索树是以一棵二叉树来组织的.每个节点是一个对象,包含的属性有left,right,p和key,其中,left指向该节点的左孩子 ...
- 二叉搜索树(BST)
目录 一,二叉搜索树(二叉查找树,二叉排序树,BST) 二,二叉搜索树的性质 三,查询 四,插入节点 五,删除节点 六,OJ实战 力扣 98. 验证二叉搜索树 面试题 04.05. 合法二叉搜索树 力 ...
- 二叉搜索树(BST)合集
目录 一.BST定义和性质 二.二叉搜索树中第K小的元素 三.把二叉搜索树转换为累加树 四.合法二叉搜索树 五.二叉搜索树中的搜索 六.二叉搜索树中的插入操作 七.在 BST 中删除一个数 八.不同的 ...
- 二叉搜索树(BST)Go实现
BST定义 二叉搜索树是二叉树的一种特殊表示形式,它满足如下特性: 每个节点中的值必须大于(或等于)存储在其左侧子树中的任何值. 每个节点中的值必须小于(或等于)存储在其右子树中的任何值. //定义二 ...
- 二叉搜索树(BST)?平衡二叉树(AVL)?
二叉搜索树:中序遍历序列是有序的. 二叉查找树,也称有序二叉树,是指一棵空树或者具有以下性质的二叉树: 左子节点的值比父节点小 右子节点的值比父节点大 任意节点的左右字树也分别为二叉查找树 没有键值相 ...
- 数据结构:二叉搜索树(BST)的基本操作
概述 学习过数据结构的童鞋都应该知道,对树的操作是一些最基本的技能(本文是对后面要写B树.B-树.B+树的一个前导,已经熟悉的朋友可以跳过了).而在树结构中,二叉树又是最基础的.虽然这些知识是比较基础 ...
最新文章
- Insert SQL Query插入效率优化
- s120面板控制调速_SINAMICS S120变频调速装置
- 【学术相关】揭秘2020年度百篇最具国际影响力论文-信息科学篇
- 实施工程师——实施中最核心的问题
- IDEA中使用Maven
- PowerDesigner 中的name与comment转换(转)
- 常用的一些页面操作 js jsp check
- java中断响应时间_Java多线程 sleep方法响应中断 sleep面试问题(与wait/notify的
- COCOS CREATOR(TS)之按钮事件
- 万能五笔输入法弹窗_万能五笔输入法广告怎么去掉
- 基于mysql的电商用户分析
- 对bootstrop中左右浮动设置
- mysql对结果再查询_SQL如何在查询结果里再次查询?
- PHP页面间参数传递
- 怎样去除掉心灵的杂草
- 数字化转型浪潮 金融科技公司如何扮演“引路人“角色?
- c++: internal compiler error: 已杀死 (program cc1plus)的解决方法
- App运营:怎么提升App下载安装量?
- SAP ECC 6.0 下载以及安装
- 【神经网络】神经网络中的矩阵的理解
热门文章
- numpy的fancy index
- 【BZOJ4919】【Lydsy1706月赛】大根堆(启发式合并,DSU on tree)
- JAVAJSP校园宿舍报修系统JSP宿舍管理系统JSP宿舍报修管理系统JSP学生公寓
- google 自制地图
- ssl加速网关_SSL加速
- 新编计算机专业英语unit2,计算机专业英语Unit_2.ppt
- CCCC L2-007. 家庭房产 建图 XJB模拟
- python scratch unity_Unity3D入门其实很简单
- 推荐系统召回策略之多路召回与Embedding召回
- DDV_MaxChars() 函数