二叉排序树(BST)

二叉排序树,又称二叉查找树(BST)

左子树结点值<根节点值<右子树结点值

如果用中序遍历来遍历一棵二叉排序树的话,可以得到一个递增的有序数列

左根右

二叉排序树的查找

//二叉排序树结点
typedef struct BSTNode{
int key;
struct BSTNode *lchild,*rchild;
}BSTNode,*BSTree;

查找是非常方便的,目标值和根节点比较,如果相等则成功,比根节点大往右去,比根节点小往左去。

查找失败就返回null

非递归方式:

//在二叉排序树中查找值为key的结点
BSTNode *BST_search(BSTree T, int key){
while(T!=NULL&&key!=T->key){ //若树为空或等于根节点值,则结束循环
if(key<T->key){ //小于,则在左子树
T=T->lchild;
}else{ //大于,则在右子树
T=T->rchild;
}
}
return T;
}

最坏空间复杂度=O(1)

递归方式:

//在二叉排序树中查找值为key的结点(递归实现)
BSTNode *BSTSearch(BSTree T,int key){
if(T==NULL){
return NULL; //查找失败
}
if(key==T->key){
return T; //查找成功
}else if(key <T->key){
return BSTSearch(T->lchild,key); //在左子树找
}else{
return BSTSearch(T->rchild,key); //在右子树找
}
}

最坏空间复杂度=O(h) 和树的高度相同

二叉排序树的插入

若原二叉排序树为空,则直接插入结点;

否则,若关键字k小于根节点值,则插入到左子树,若关键字k大于根节点值,则插入到右子树。

//在二叉排序树插入关键字为k的新节点(递归实现)
int BST_Insert(BSTree &T,int k){
if(T == NULL){ //原树为空,新插入的结点为根节点
T=(BSTree)malloc(sizeof(BSTNode));
T->key = k;
T->lchild = T->rchild = NULL;
return 1; //返回1,插入成功
}else if(k == T->key){ //树中不能存在相同关键字的结点,插入失败
return 0;
}else if(k<T->key){ //插入到T的左子树
return BST_Insert(T->lchild,k);
}else{ //插入到T的右子树
return BST_Insert(T->rchild,k);
}
}

最坏空间复杂度=O(h)

二叉排序树的构造

其实就是不断插入新节点的过程

//按照str[]中的关键字序列建立二叉排序树
void Creat_BST(BSTree &T,int str[],int n){
T = NULL; //初始化时T为空树
int i = 0;
while(i<n){ //依次将每个关键字插入到二叉排序树
BST_Insert(T,str[i]);
i++;
}
}

不同的关键字序列可能得到同款二叉排序树,也可能得到不同款二叉排序树

二叉排序树的删除

先搜索找到目标结点:

(需要保证二叉排序书的特性——左子树结点值<根节点值<右子树结点值)

  • 若是被删除的结点z是叶节点,则直接删除,不会破坏二叉排序树的性质。

  • 若结点z只有一棵左子树或右子树,则让z的子树称为z父节点的子树,替代z的位置

  • 若结点z有左、右两棵子树,则令z的直接后继(或直接前驱)替代z,然后从二叉排序树中删去这个直接后继(或直接前驱),这样就转换成了第一或第二种情况。

进行中序遍历,可以得到一个递增的有序序列。

用右子树最小的值来替代被删除的值(最左下)

用左子树最大的值来替代被删除元素(最右下角)

查找效率分析

查找长度——在查找运算中,需要对比关键字的次数称为查找长度,反应了查找操作时间复杂度

查找成功的平均查找长度ASL(Average Search Length)

树高h,找到最下层的一个结点需要对比h次

最坏情况:每个节点只有一个分支,树高h=结点数n。平均查找长度=O(n)

最好情况:

n个结点的二叉树最小高度为

\[\lfloor log_2n \rfloor+1
\]

平均查找长度=

\[O(log_2n)
\]

查找失败

二叉排序树(BST)的更多相关文章

  1. 二叉排序树(BST)创建,删除,查找操作

    binary search tree,中文翻译为二叉搜索树.二叉查找树或者二叉排序树.简称为BST 一:二叉搜索树的定义 他的定义与树的定义是类似的,也是一个递归的定义: 1.要么是一棵空树 2.如果 ...

  2. 二叉排序树(BST)构造与应用

             二叉排序树(BST)构造与应用       本文取自<数据结构与算法>(C语言版)(第三版).出版社是清华大学出版社.       本博文作为学习资料整理. 源码是VC+ ...

  3. 【数据结构】简单谈一谈二分法和二叉排序树BST查找的比较

    二分法查找: 『在有序数组的基础上通过折半方法不断缩小查找范围,直至命中或者查询失败.』   二分法的存储要求:要求顺序存储,以便于根据下标随机访问   二分法的时间效率:O(Log(n))   二分 ...

  4. 二叉排序树BST代码(JAVA)

        publicclassTest{     publicstaticvoid main(String[] args){         int[] r =newint[]{5,1,3,4,6,7 ...

  5. 二叉排序树BST+求树深度算法

    #include "stdio.h" #include "malloc.h" typedef struct node { int key; struct nod ...

  6. 判断二叉树是否二叉排序树(BST)

    算法思想:由于二叉排序树的中序遍历可以得到一个有序的序列,因此,我们可以使用中序遍历进行求解. 代码如下: #include <stack> using namespace std; ty ...

  7. 哈夫曼树;二叉树;二叉排序树(BST)

    优先队列:priority_queue<Type, Container, Functional>Type 为数据类型, Container 为保存数据的容器,Functional 为元素比 ...

  8. 二叉排序树BST

    注意:对一个二叉排序树进行中序遍历时,得到的序列是一个按值从小到大排列的有序序列 查找性能的分析:

  9. 关于二叉排序树 BST

    #include<stdio.h> #include<stdlib.h> typedef struct node { double w; struct node *l,*r; ...

  10. 4.5---判断是否是二叉排序树BST(CC150)

    public boolean checkBST(TreeNode root) { return isBST(root, Long.MIN_VALUE, Long.MAX_VALUE); } publi ...

随机推荐

  1. 解决IE下readonly的Input光标选中的问题

    首先用unselectable="on"解决,但是这种方法bug太多, 屏蔽了input的onblur事件(也就是focus事件在Angualr下),所以只能用click事件来代替 ...

  2. Spring第二天,你必须知道容器注册组件的几种方式!学废它吊打面试官!

    ​ 前一篇<不要再说不会Spring了!Spring第一天,学会进大厂!>文章可点击下方链接进行回看. 不要再说不会Spring了!Spring第一天,学会进大厂! 今天将继续讲解Spri ...

  3. jsonp和普通的ajax区别

    1.请求类型.返回类型不一样 2.返回数据类型

  4. java面试官最爱问的垃圾回收机制,这位阿里P7大佬分析的属实到位

    前言 JVM 内存模型一共包括三个部分: 堆 ( Java代码可及的 Java堆 和 JVM自身使用的方法区). 栈 ( 服务Java方法的虚拟机栈 和 服务Native方法的本地方法栈 ) 保证程序 ...

  5. python中a+=b 和a=a+b的结果一样吗

    这里涉及到可变类型和不可变类型. 可变类型:列表,字典,集合 不可变:数字,字符串,元祖 先看一下不可变类型的运算: +=运算 >>> a, b = 1, 2 >>> ...

  6. CorelDRAW:油漆滚轮及LOGO设计

    小马坐在电脑前,看着自己画的油漆滚轮Logo,既生气又无奈.为了这个油漆Logo,小马用了四.五个不同的设计软件,也画了不下10个图案,就没有一个满意的."明天就要交稿了,现在都11点多了, ...

  7. 【PYTEST】第四章Fixture

    知识点: 利用fixture共享数据 conftest.py共享fixture 使用多个fixture fixture作用范围 usefixture 重命名 1. 利用fixture共享数据 test ...

  8. windows创建隐藏用户的powershell脚本

    通过保存并重新注册已删除用户的注册表的方式来隐藏用户,未登录时登陆界面不可见,登陆后可见 方法详情见: https://www.k0rz3n.com/2018/06/26/windows%E6%B8% ...

  9. F - LCS 题解(最长公共子序列记录路径)

    题目链接 题目大意 给你两个字符串,任意写出一个最长公共子序列 字符串长度小于3e3 题目思路 就是一个记录路径有一点要注意 找了好久的bug 不能直接\(dp[i][j]=dp[i-1][j-1]+ ...

  10. Codeforces Round #665 (Div. 2) D. Maximum Distributed Tree 题解(贪心+易错)

    题目链接 题目大意 给你一课树,要你给每一条边分权值,每条边的权值大于0,他们的乘积等于k,而且要使得n-1条边1的数量尽可能少,定义 f(u,v)为u到v的边权和求 \(\max \sum_{i=1 ...