Ⅰ 索树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】【基本应用汇合】相关推荐

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

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

  2. 中根遍历二叉查找树所得序列一定是有序序列_二叉搜索树(BST)

    点击上方"蓝字",发现更多精彩. 前面我们介绍了树的基本概念,并引出了二叉树.值得注意的是,无特征的二叉树在工程上几乎没啥用处,一般都是使用bst.avl,trie,rbtree等 ...

  3. 二叉搜索树的删除操作可以交换吗_JavaScript数据结构 — 二叉搜索树(BST)ES6实现...

    1. 概述 最基本的数据结构是向量和链表,为了将二者的优势结合起来,我们引入了二叉树,可以认为二叉树是列表在维度上的拓展.而今天要介绍的二叉搜索树(BST)则是在形式上借鉴了二叉树,同时也巧妙借鉴了有 ...

  4. 深入理解二叉搜索树(BST)

    一棵二叉搜索树(BST)是以一棵二叉树来组织的,可以用链表数据结构来表示,其中,每一个结点就是一个对象,一般地,包含数据内容key和指向孩子(也可能是父母)的指针属性.如果某个孩子结点不存在,其指针属 ...

  5. 二叉搜索树(BST)——基本概念及基本实现代码

    二叉搜索树(BST)--基本概念及基本实现代码 1.二叉搜索树概念 二叉搜索树是以一棵二叉树来组织的.每个节点是一个对象,包含的属性有left,right,p和key,其中,left指向该节点的左孩子 ...

  6. 二叉搜索树(BST)

    目录 一,二叉搜索树(二叉查找树,二叉排序树,BST) 二,二叉搜索树的性质 三,查询 四,插入节点 五,删除节点 六,OJ实战 力扣 98. 验证二叉搜索树 面试题 04.05. 合法二叉搜索树 力 ...

  7. 二叉搜索树(BST)合集

    目录 一.BST定义和性质 二.二叉搜索树中第K小的元素 三.把二叉搜索树转换为累加树 四.合法二叉搜索树 五.二叉搜索树中的搜索 六.二叉搜索树中的插入操作 七.在 BST 中删除一个数 八.不同的 ...

  8. 二叉搜索树(BST)Go实现

    BST定义 二叉搜索树是二叉树的一种特殊表示形式,它满足如下特性: 每个节点中的值必须大于(或等于)存储在其左侧子树中的任何值. 每个节点中的值必须小于(或等于)存储在其右子树中的任何值. //定义二 ...

  9. 二叉搜索树(BST)?平衡二叉树(AVL)?

    二叉搜索树:中序遍历序列是有序的. 二叉查找树,也称有序二叉树,是指一棵空树或者具有以下性质的二叉树: 左子节点的值比父节点小 右子节点的值比父节点大 任意节点的左右字树也分别为二叉查找树 没有键值相 ...

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

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

最新文章

  1. Insert SQL Query插入效率优化
  2. s120面板控制调速_SINAMICS S120变频调速装置
  3. 【学术相关】揭秘2020年度百篇最具国际影响力论文-信息科学篇
  4. 实施工程师——实施中最核心的问题
  5. IDEA中使用Maven
  6. PowerDesigner 中的name与comment转换(转)
  7. 常用的一些页面操作 js jsp check
  8. java中断响应时间_Java多线程 sleep方法响应中断 sleep面试问题(与wait/notify的
  9. COCOS CREATOR(TS)之按钮事件
  10. 万能五笔输入法弹窗_万能五笔输入法广告怎么去掉
  11. 基于mysql的电商用户分析
  12. 对bootstrop中左右浮动设置
  13. mysql对结果再查询_SQL如何在查询结果里再次查询?
  14. PHP页面间参数传递
  15. 怎样去除掉心灵的杂草
  16. 数字化转型浪潮 金融科技公司如何扮演“引路人“角色?
  17. c++: internal compiler error: 已杀死 (program cc1plus)的解决方法
  18. App运营:怎么提升App下载安装量?
  19. SAP ECC 6.0 下载以及安装
  20. 【神经网络】神经网络中的矩阵的理解

热门文章

  1. numpy的fancy index
  2. 【BZOJ4919】【Lydsy1706月赛】大根堆(启发式合并,DSU on tree)
  3. JAVAJSP校园宿舍报修系统JSP宿舍管理系统JSP宿舍报修管理系统JSP学生公寓
  4. google 自制地图
  5. ssl加速网关_SSL加速
  6. 新编计算机专业英语unit2,计算机专业英语Unit_2.ppt
  7. CCCC L2-007. 家庭房产 建图 XJB模拟
  8. python scratch unity_Unity3D入门其实很简单
  9. 推荐系统召回策略之多路召回与Embedding召回
  10. DDV_MaxChars() 函数