首页 > 编程语言 >数据结构与算法-二叉排序树

数据结构与算法-二叉排序树

时间:2023-02-09 12:32:04浏览次数:37  
标签:结点 排序 bst 二叉 查找 key 数据结构


一棵二叉排序树(Binary Sort Tree)(又称二叉查找树)或者是一棵空二叉树,或者是具有下列性质的二叉树:

1. 若它的左子树不空,则左子树上所有结点的键值均小于它的根结点键值;

2. 若它的右子树不空,则右子树上所有结点的键值均大于它的根结点键值;

3. 根的左、右子树也分别为二叉排序树。

数据结构与算法-二叉排序树_二叉排序树

由上图可知,二叉排序树是一棵特殊的二叉树,由于它的特殊性质,中序遍历一棵二叉排序树所得的结点访问序列是键值的递增序列。

二叉树的二叉链表类型定义如下:

typedef struct btnode{
KeyType key;
// 指向左右孩子的指针
struct btnode *lchild ,*rchild;
// BinTree为指向二叉链表结点的指针类型
}BSTNode ,*BinTree;
// bst为指向二叉排序树根结点的指针
BinTree bst;

1. 二叉排序树的查找

当二叉排序树不为空时,首先将给定值和根结点的关键字比较,若相等,则查找成功;否则根据给定值与根结点关键字间的大小关系,分别在左子树和右子树上继续进行查找。算法描述如下:

BinTree SearchBST(BinTree bst ,KeyType key){ 
// 不成功时返回 NULL 作为标记
if (bst== NULL){
return NULL;
// 成功时返回结点地址
}else if (key==bst->key) {
return bst;
// 继续在左子树中查找
}else if ( key<bst->key){
return SearchBST (bst->lchild, key);
// 继续在右子树中查找
}else{
return SearchBST (bst->rchild, key);
}

}

在二叉排序树上进行查找,若查找成功,则是从根结点出发走 了一条从根结点到待查结点的路径;若查找不成功,则是从根结点出发走了一条从根到某个叶子的路径。因此与二分查找类似,关键字比较的次数不超过二叉树的深度。

2. 二叉排序树的插入

由于二叉排序树这种动态树表是在查找过程中,不断的往树中插入不存在的键值而形成的,所以插入算法必须包含查找过程,并且是在查找不成功时进行插入新结点的操作。

在二叉排序树上进行插入的原则是:必须要保证插入一个新结点之后,仍为一棵二叉排序树,这个结点是查找不成功时查找路径上访问的最后一个结点的左孩子或右孩子。

数据结构与算法-二叉排序树_二叉排序树_02

二叉排序树的插入算法描述:

int InsertBST(BinTree bst, KeyType key){
BSTNode *p,*t,*f;
// f为指向查到结点的双亲,初始值为NULL
f = null;
t = SearchBST(bst,key,f);
// 查找不成功时插入新结点
if(t == NULL){
p = malloc(sizeof(btnode));
p->key = key;
p->lchild = NULL;
P->rchild = NULL;

if(f ==NULL){
// 被插入结点为新的根结点
bst = p;
}else if(key<f->key){
// 被插入结点p为f左孩子
f->lchild = p;
}else{
// 被插入结点p为f右孩子
f->rchild = p;
};
return 1;
}else{
// 查找成功时不用插入结点
return 0
}
}

二叉排序树的建树过程:

数据结构与算法-二叉排序树_算法_03

3. 二叉排序树的分析

二叉排序树上的平均查找长度是介于O(n)和O(log2n)之间的,其查找效率与树的形态有关。

数据结构与算法-二叉排序树_数据结构_04

上图a中的平均查找长度是O(log2n),图b的二叉树为一条单枝,查找算法退化为顺序查找,平均查找长度上升为(n+1)/2,即平均查找长度为O(n),为了提高二叉排序树的查找效率,避免图b这样的情况,需要在二叉排序树的动态变化过程中随时调整其形态,使之保持“平衡”,也就是平衡二叉树的概念。

标签:结点,排序,bst,二叉,查找,key,数据结构
From: https://blog.51cto.com/u_15959833/6046812

相关文章

  • 数据结构与算法-拓扑排序
    在工程实践中,一个工程往往由若干个子项目组成,这些子项目中往往有两种关系。1.先后关系,即必须在一个子项目完成后,才能开始实施另一个子项目。2.子项目间无关系,即两个子项目......
  • 数据结构与算法-求最短路径之迪杰斯特拉(Dijkstra)算法
    迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径,它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。1.......
  • MySQL的数据结构
    阅读目录MySQL数据结构用b+tree做的为什么不用红黑树叉树呢?什么是B-Tree(B-树)?什么是B+Tree?B+Tree相对于B-Tree的几点不同MySQL数据结构用b+tree......
  • mysql分组排序
    mysql的分组排序在实际应用中是经常用到的之前用pgsql的时候是有窗口函数来实现的,非常方便row_number()over(partitionby分组字段orderby排序字段desc)但是现......
  • 图形学数据结构 half-edge
    这个东西,看了之后只有一个感觉WC你看了之后,很可能会感觉 俺也一样这是​​https://www.flipcode.com/archives/The_Half-Edge_Data_Structure.shtml​​介绍是用来精细化......
  • 第02天-python线性数据结构
    1、数值处理1.1、内建常用数据类型1.1.1、分类数值型int、float、complex、bool序列sequence字符串str、字节序列bytes、bytearray列表list、元组t......
  • sort()排序以及多个属性数组对象排序(按条件排序)
    原生排序letarr=[5,2,1,4,9,8]for(leti=0;i<arr.length;i++){for(letj=0;j<arr.length-1;j++){if(arr[j]>......
  • 2.K个排序链表归并(Leetcode 23)
    方法一:#include<stdio.h>structListNode{ intval; ListNode*next; ListNode(intx):val(x),next(NULL){}};#include<vector>#include<algorithm>b......
  • 7.两个排序链表的交点(Leetcode 160)
    7.两个排序链表的交点(Leetcode160)方法一:#include<stdio.h>structListNode{ intval; ListNode*next; ListNode(intx):val(x),next(NULL){}};#include......
  • 在排序数组中查找元素的第一个和最后一个位置(Leetcode34)
    3.在排序数组中查找元素的第一个和最后一个位置(Leetcode34)给定一个按照升序排列的整数数组nums,和一个目标值target。找出给定目标值在数组中的开始位置和结束位置。如......