二叉排序树(BST)
二叉排序树(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个结点的二叉树最小高度为
\]
平均查找长度=
\]
查找失败
二叉排序树(BST)的更多相关文章
- 二叉排序树(BST)创建,删除,查找操作
binary search tree,中文翻译为二叉搜索树.二叉查找树或者二叉排序树.简称为BST 一:二叉搜索树的定义 他的定义与树的定义是类似的,也是一个递归的定义: 1.要么是一棵空树 2.如果 ...
- 二叉排序树(BST)构造与应用
二叉排序树(BST)构造与应用 本文取自<数据结构与算法>(C语言版)(第三版).出版社是清华大学出版社. 本博文作为学习资料整理. 源码是VC+ ...
- 【数据结构】简单谈一谈二分法和二叉排序树BST查找的比较
二分法查找: 『在有序数组的基础上通过折半方法不断缩小查找范围,直至命中或者查询失败.』 二分法的存储要求:要求顺序存储,以便于根据下标随机访问 二分法的时间效率:O(Log(n)) 二分 ...
- 二叉排序树BST代码(JAVA)
publicclassTest{ publicstaticvoid main(String[] args){ int[] r =newint[]{5,1,3,4,6,7 ...
- 二叉排序树BST+求树深度算法
#include "stdio.h" #include "malloc.h" typedef struct node { int key; struct nod ...
- 判断二叉树是否二叉排序树(BST)
算法思想:由于二叉排序树的中序遍历可以得到一个有序的序列,因此,我们可以使用中序遍历进行求解. 代码如下: #include <stack> using namespace std; ty ...
- 哈夫曼树;二叉树;二叉排序树(BST)
优先队列:priority_queue<Type, Container, Functional>Type 为数据类型, Container 为保存数据的容器,Functional 为元素比 ...
- 二叉排序树BST
注意:对一个二叉排序树进行中序遍历时,得到的序列是一个按值从小到大排列的有序序列 查找性能的分析:
- 关于二叉排序树 BST
#include<stdio.h> #include<stdlib.h> typedef struct node { double w; struct node *l,*r; ...
- 4.5---判断是否是二叉排序树BST(CC150)
public boolean checkBST(TreeNode root) { return isBST(root, Long.MIN_VALUE, Long.MAX_VALUE); } publi ...
随机推荐
- property,类方法和静态方法
# from math import pi # # class Circle: # def __init__(self, r): # self.r = r # # @property # def pe ...
- Camtasia中对录制视频进行编辑——行为
小视频的逐渐兴起,让我们的生活变得多姿多彩,同时,也造就了一批新媒体的创业者还有越来越多的网红,这不禁使我们也想加入他们的行列.但是问题来了,拍摄视频后最重要的是对视频进行剪辑,没有一款经济适用的软件 ...
- 用MindManager做完思维导图后怎么加密
使用MindManager我们可以制作出很多简洁明了的思维导图,然而,不论是分享还是查看这些导图,我们往往需要对导图进行加密操作,尤其是制定公司或企业的下一步发展计划时,加密导图就显得很有必要了. M ...
- CorelDRAW“出血线”的精准预设与辅助线便捷操作
CorelDRAW软件是一款常用的制图工具,非常适合用于印刷品输出,各种印刷图文制作都依赖于它.所以,我们设计者每次用CorelDRAW制图的一个关键就是要做好"标尺辅助线"设置, ...
- guitar pro系列教程(二十):Guitar Pro使用技巧之使用向导
本章节将采用图文结合的方式为大家讲述{cms_selflink page='index' text='Guitar Pro'}使用技巧里面的使用向导的相关知识,有兴趣的朋友可以一起来学习哦. 当你创建 ...
- 为什么换了电脑安装MindManager提示密钥失效?
相信很多MindManager用户遇到过这样的问题,不想在原电脑上使用MindManager思维导图软件,想要换电脑安装,但是提示该许可证密钥失效了.下面文章就教大家如何解决这个问题: 我们在Mind ...
- Java复数的定义与描述
1 //4.复数的定义与描述 2 package test; 3 4 import java.util.Scanner; 5 6 public class complex {//复数类 7 doubl ...
- 【抓取】6-DOF GraspNet 论文解读
[抓取]6-DOF GraspNet 论文解读 [注]:本文地址:[抓取]6-DOF GraspNet 论文解读 若转载请于明显处标明出处. 前言 这篇关于生成抓取姿态的论文出自英伟达.我在读完该篇论 ...
- 做IT需要掌握的电力基础知识
电流 损耗 直流电的传输损耗大,所以不适合长距离传输, 交流电的传输损耗小,所以适合长距离传输, 使用 直流电电压稳定,无白躁声,故适於电子产品使用(例如电视机,收音机电脑等), 交流电要经过整流/开 ...
- LeetCode 048 Rotate Image
题目要求:Rotate Image You are given an n x n 2D matrix representing an image. Rotate the image by 90 deg ...