二叉排序树

一文讲透数据结构中的树,建议收藏!

跟風遠走 提交于 2020-04-04 10:32:16
数据结构是 10 年前大学里学的一门课程,也是我北漂唯一携带的一本书。幸运的是,书还没有被孩子给撕碎。 为了让大家都能够搞懂「树」这个苦涩而硬核的知识,今天就重拾记忆,分享一下研发人员心中那些放不下的「树」。 不过,一定要冲好咖啡、沏壶好茶,心平气和去看文。 01. 「树」现实与虚拟的抽象 在「中华姓氏树」中寻找一片属于你的叶子,探寻一下家族的来源。 在脑海里尝试画一下「家谱树」。 看完现实中的树,那来看一看计算机的文件系统组织形式。 无论是现实的姓氏树、家谱树,还是计算机的文件系统,表现形式虽然不同,但是本质上却都是树。 那到底什么是树呢? 树是由 n(n≥0)个结点组成的有限集合。 当 n = 0 时,称为空树; 当 n > 0 时,有一个特殊的节点称为根结点(root),它没有前驱结点;其它结点分为 m 棵互不相交的子树。 如图示意,(a)为空树;(b)为 1 个结点的树;(c)为 n 个结点的树。 知道了什么是树,上面「家谱树」以及「文件系统」用到的树表示法,有没有学名呢?稍微科普一下。 图示法:是树的直观表示法,主要用于描述树的逻辑结构,如上面提到的家谱树。 横向凹入表示法:是用逐层缩进方法表示结点之间的层次关系,主要用于树的屏幕显示和打印输出,如上面提到的文件系统。 知道了什么树以及树的部分表示法,但是猿有猿声,鸟有鸟语,树也有术语。 02.「树」有术语 节点 or

数据结构之二叉排序树

心已入冬 提交于 2020-03-18 14:31:18
某厂面试归来,发现自己落伍了!>>> 概念: 二叉搜索树是一种节点值之间具有一定数量级次序的二叉树。对于树中的每个节点: 若其左子树存在,则其左子树中每个节点的值都不大于该节点的值。 若其右子树存在,则其右子树中每个节点的值都不小于该节点的值。 该节点的左右子树都是二叉搜索树。 没有键值相等的节点。 public class BSTree<T extends Comparable<T>> { private BSTNode<T> mRoot; @Data public class BSTNode<T extends Comparable<T>> { T key; BSTNode<T> left; BSTNode<T> right; BSTNode<T> parent; public BSTNode() { super(); } public BSTNode(T key, BSTNode<T> left, BSTNode<T> right, BSTNode<T> parent) { this.key = key; this.left = left; this.right = right; this.parent = parent; } } } 前驱与后继: 前驱:该节点左子树中最大的节点。数值紧挨着小于的值。 public BSTNode<T> predecessor(BSTNode

【数据结构】查找

风流意气都作罢 提交于 2020-03-11 23:15:00
平均查找长度(ASL, Average Search Length): 在查找过程中,一次查找的长度是指需要比较的关键字次数,而平均查找长度则是所有查找过程中进行关键字比较次数的平均值,(即 ASL= \(\sum\) 查找概率*比较次数 )(一般为等概率1/n) 静态查找表: 查找表的操作无需动态地修改查找表,如 顺序查找、折半查找、散列查找等。 动态查找表: 需要动态地插入或删除的查找表,如 二叉排序树、二叉平衡树、B树、散列查找等。 线性结构 顺序查找 适用条件: 适用于 线性表 基本思想: 从线性表的一段开始,逐个检查关键字是否满足给定的条件。若查找到某个元素的关键字满足给定的条件,则查找成功,返回该元素在线性表中的位置;若已经查找到表的另一端,但还没有查找到符合给定条件的元素,则返回查找失败的信息。 具体实现: typedef struct { //查找表的数据结构 ElemType *data; //元素空间基址,建表时按实际长度分配,0号单元留空 int length; //表的长度 }List; //Sequential Search Table //在顺序表L中顺序查找关键字为key的元素。若找到则返回该元素在表中的位置 int Search_Seq(List L, ElemType key) { L.data[0] = key; //“哨兵” for(i = L

二叉排序树的实现和查找 swust oj#1011

…衆ロ難τιáo~ 提交于 2020-03-05 15:33:52
二叉排序树就是插入值比当前节点小的就往当前节点的左子树递归,比当前节点大的就往当前节点的右子树递归,若遇到空节点(即不能比较下去)就在这个位置建立新节点节点值为插入值。 附代码: # include <iostream> using namespace std ; typedef struct l { int val ; struct l * lchild , * rchild ; } lb ; int n , k , flag ; void insertBST ( lb * & T , int k ) { //注意引用T if ( T == NULL ) { T = new lb ; T - > val = k ; T - > lchild = T - > rchild = NULL ; return ; } if ( T - > val < k ) { insertBST ( T - > rchild , k ) ; } else if ( T - > val > k ) { insertBST ( T - > lchild , k ) ; } } lb * chushi ( lb * & T ) { T = new lb ; int d ; cin >> d ; T - > val = d ; T - > lchild = T - > rchild = NULL ;

NOIP需要掌握的内容(大致

旧街凉风 提交于 2020-03-02 11:41:13
1、 排序算法(快排、选择、冒泡、堆排序、 二叉排序树 、桶排序) 2、 DFS/BFS 剪枝 哈希表 3、树 ① 遍历 ② 二叉树 ③二叉排序树(查找、生成、删除) ④堆(二叉堆、左偏树、堆排序) ⑤Trie树 4、图(图论建模) ① 最小生成树 ② 最短路径 ③计算图的传递闭包 ④ 连通分量(其中要掌握并查集技术) 强连通分量tarjin ⑤ 拓扑排序 、关键路径 ⑥哈密尔顿环 ⑦ 欧拉回路 (USACO 3.3 题1 Fence) ⑧ Bell-man Ford、SPFA(能解决负权回路) (USACO 3.2 题6 Butter) ⑨二分图(匈牙利算法)(USACO 4.2 题2 stall) 5、动态规划(背包问题只是其中一种) ① 线性动规 ② 区间动规 ③ 树形动规 ④图形动规 6、 分治 (掌握了动规分治就好学了) 7、 贪心 8、 位运算 (可以用来进行优化) 来源: https://www.cnblogs.com/GldHkkowo/p/8710834.html

二叉排序树(Binary Sort Tree)

感情迁移 提交于 2020-03-01 01:23:33
1、定义 二叉排序树(Binary Sort Tree)又称 二叉查找(搜索)树 (Binary Search Tree)。其定义为:二叉排序树或者是空树,或者是满足如下性质的二叉树: ① 若它的左子树非空,则左子树上所有结点的值均小于根结点的值; ② 若它的右子树非空,则右子树上所有结点的值均大于根结点的值; ③ 左、右子树本身又各是一棵二叉排序树。 上述性质简称二叉排序树性质(BST性质),故二叉排序树实际上是满足BST性质的二叉树。 注意: 当用线性表作为表的组织形式时,可以有三种查找法。其中以二分查找效率最高。但由于二分查找要求表中结点按关键字有序,且不能用链表作存储结构,因此,当表的插入或删除操作频繁时,为维护表的有序性,势必要移动表中很多结点。这种由移动结点引起的额外时间开销,就会抵消二分查找的优点。也就是说,二分查找只适用于静态查找表。若要对动态查找表进行高效率的查找,可采用下二叉树或树作为表的组织形式。不妨将它们统称为树表。 2、特点 由BST性质可得: (1) 二叉排序树中任一结点x,其左(右)子树中任一结点y(若存在)的关键字必小(大)于x的关键字。 (2) 二叉排序树中,各结点关键字是惟一的。 注意: 实际应用中,不能保证被查找的数据集中各元素的关键字互不相同,所以可将二叉排序树定义中BST性质(1)里的"小于"改为"大于等于",或将BST性质(2)里的"大于

二叉排序树结点的插入与删除操作

独自空忆成欢 提交于 2020-02-28 14:33:36
二叉排序树结点的插入与删除操作 一 二叉排序树的性质   二叉排序树,又称二叉搜索树,它最重要的性质就是: 根结点左子树中所有结点的值均小于根结点值,右子树中所有结点的值都大于根结点的值 ,所以我们在中序遍历这棵二叉树时,将会得到一个升序序列,这也是我们验证二叉排序树的一个手段。   对应的数据结构定义为: typedef struct Node { //一个数据域和左右两个指针域 int data ; struct Node * lchild , * rchild ; } Node ; 二 二叉树结点的插入 首先将待插入结点的值与根结点的值作比较,若val == root->data,此时我们直接返回当前root指针,因为我们规定,二叉排序树中不存在值相同的结点。 若待插入结点的值小于根结点的值,此时我们应该进入根结点的左子树 若待插入结点的值大于根结点的值,此时我们应该进入根结点的右子树 若指针为空,此时我们根据传入的值创建结点,并返回创建的结点指针 Node * getNewNode ( int val ) { Node * node = ( Node * ) malloc ( sizeof ( Node ) ) ; node - > data = val ; node - > lchild = node - > rchild = NULL ; return node ; }

数据结构 之 二叉排序树

和自甴很熟 提交于 2020-02-23 16:23:27
1、什么是二叉排序树 二叉排序树 又叫(排序树 搜索数)他是一个一棵空树,或者是一棵具有如下性质的树: 1)若左子树不为空,那么左子树上面的所有节点的关键字值都比根节点的关键字值小 2)若右子树不为空,那么右子树上面的所有节点的关键字值都比根节点的关键字值大 3)左右子树都为二叉树 4)没有重复值(这一点在实际中可以忽略) 2、如何遍历 二叉树中序遍历,先访问左节点,然后访问中间节点,然后在访问右节点 如上图 中序遍历一个树, 1、先访问根节点的左子树 12 ,它有左子树? 有 --> 结果: 2、访问 12 的左子树 9 ,它有左子树? 没有 --> 结果:9 3、它有右子树? 没有,访问上一级 --> 结果:9 12 4、12 是否有右子树 ? 有 , 访问 40 --》 结果: 9 12 5、 40是否有左子树? 有, 访问 35 ,且35 没有左子树 --> 结果: 9 12 35 6、 检查35 是否有右子树? 没有 , 访问它的根节点 --》 结果: 9 12 35 40 7、检查 40 是否有右子树? 有,访问 190 ,它有左子树 8、访问它的左子树 146, 检查它有左子树? 没有 —》 结果: 9 12 35 40 146 9、检查它有右子树? 无 , 访问它的父节点 190 --》 结果 : 9 12 35 40 146 190 10、 检查190

查找——二叉排序树

陌路散爱 提交于 2020-02-17 20:08:49
二叉排序树(Binary Sort Tree),又称为二叉查找树,它具备以下性质,若它的左子树不为空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不为空,则右子树上所有结点的值均大于它的根结点的值;它的左右子树也分别为二叉排序树。 1、二叉排序树的查找操作 递归查找二叉排序树T中是否存在key,指针f指向T的双亲,其初始调用值为NULL,若查找成功,则指针p指向该数据元素结点,并返回TRUE,否则指针p指向查找路径上访问的最后一个结点并返回FALSE。 2、二叉排序树的删除操作 找到key元素的结点并进入Delete函数删除该结点,删除结点三种情况进行分析:叶子结点;仅有左或右子树结点,左右子树都有结点。在实际操作中,通过递归找到删除的结点p: 若右子树为空,只需将该结点的左子树重接上去,该结点删除free; 若左子树为空,只需将该结点的右子树重接上去,该结点删除free; 若左右子树都不为空,找到删除结点*p的左孩子的最右结点s,将删除结点*p的左孩子的最右结点s的值替代删除结点*p的值,第一种情况是删除结点*p的左孩子有右子树,因为删除结点*p的左孩子的最右结点s的值替代删除结点*p的值,那么s->L替代s结点,所以q->R=s->L;第二种情况是删除结点*p的左孩子没有右子树,q就是*p要删除的结点,所以q->L = s->L,最后free结点s 3

Tree

两盒软妹~` 提交于 2020-02-17 12:29:55
Tree 星星为什么这么渺小?那是因为他们把自己放的太高了! 背景 :简单了解二叉树、平衡树、红黑树、B树和B+树之间的特点和差异。 1. 二叉排序树的特点 a、树的左边节点比根节点小,右边节点比根节点大; b、左右子树也都是二叉排序树; c、但是,在一些特殊情况下,比如插入数据是有序的,就会发生退化情况,如有序序列,即二叉排序树退化成链表。 图1. 二叉树 2. 平衡树 图2. 红黑树 1、为了保证树的平衡,引入了平衡树。在插入数据的时候,同时调整这棵树,让它的节点尽可能均匀分布; 2、红黑树就是平衡树的一种,jdk内置的TreeSet底层就是用的红黑树; 3、之所以要保证树的平衡性,是因为树的查找性能取决于树的高度,让树尽可能平衡,就是为了降低树的高度。 3. B树 a、B树是一种多路搜索树,他的每个节点可以拥有多余两个孩子节点,M路的B树最多能拥有M个孩子节点; b、这种多路的设计,可以进一步降低树的高度。路数越多,树的高度越低。如果设计成无限多路,B树就退化成有序数组了; c、B树一般用于文件系统索引,文件系统和数据库索引一般都存储在硬盘上的,如果数据量大的话,不一定能一次性加载到内存中;如果一棵树无法一次性加载进内存,这时候B树的多路存储能力就出来了,可以每次加载B树的一个节点,然后一步步往下找;如果在内存中,红黑树比B树效率更高,但是涉及到磁盘操作,B树就更优了。 图3