数据结构笔记:伸展树、B树、红黑树

概述

  1. 伸展树
  2. B树
  3. 红黑树
小试牛刀
1
2
3
4
5
伸展树利用了实际问题中数据访问的何种特点
A. massiveness 大量性
B. locality 局部性
C. holisticity 整体性
D. diversity 多样性
伸展树:逐层伸展

局部性:

image-20250803042354639

逐层伸展

image-20250803042608558

最坏情况:

image-20250803042944328

image-20250803105714110

伸展树:双层伸展

image-20250803111656578

子孙异侧:

子孙同侧:

image-20250803112136859

折叠效果:

image-20250803113053638

image-20250803112919415

image-20250803112959905

分摊性能:

image-20250803113230969

最后一步:

image-20250803113355311

伸展树:算法实现

image-20250803115615760

image-20250803124628698

image-20250803130532245

查找算法:

image-20250803130756489

1
2
3
4
5
template <typename T> BinNodePosi<T>& Splay<T>::search( const T& e ) { //在伸展树中查找e
BinNodePosi<T> p = BST<T>::search( e ); //按BST标准算法查找
_root = p ? splay(p) : _hot ? splay(_hot) : NULL; //无论成功、失败、树空,被访问的节点将伸展至根
return _root;
} //与其它BST不同,无论如何,_root都指向最后被访问的节点

插入算法:

image-20250803131028523

1
2
3
4
5
6
7
8
9
10
template <typename T> BinNodePosi<T> Splay<T>::insert( const T& e ) { //将关键码e插入伸展树中
if ( !_root ) { _size = 1; return _root = new BinNode<T>( e ); } //原树为空
BinNodePosi<T> t = search( e );
if ( e == t->data ) return t; //目标节点t若存在,伸展至根
if ( t->data < e ) //在右侧嫁接
{ t->parent = _root = new BinNode<T>( e, NULL, t, t->rc ); t->rc = NULL; }
else //在左侧嫁接
{ t->parent = _root = new BinNode<T>( e, NULL, t->lc, t ); t->lc = NULL; }
_size++; t->updateHeightAbove(); return _root; //更新规模及高度,报告插入成功
} //无论e是否存在于原树中,返回时总有_root->data == e

删除算法:

image-20250803131247082

综合评价:

无需记录节点高度或者平衡因子,编程实现简易

分摊复杂度O(logn) 与AVL相当

局部性强

image-20250803131539577

B树:大数据

image-20250803183755146

image-20250803184111226

image-20250803184311495

B树:结构

image-20250803190139979

多路平衡

image-20250803185344112

减少了I/O次数

image-20250803185529252

阶次

image-20250803185927010

BTree

image-20250803191426396

习题:

image-20250803192023683

image-20250803192055317

B树:查找

image-20250805014618043

最大高度:

image-20250805015456349

最小高度:

image-20250805015704390

习题

zhangzezhong

学习自:清华大学邓俊辉老师《数据结构 下》课程第十章 高级搜索树