一、搜索数据结构
1. 概述
1)搜索/查找:
①遍历查找 O(n)
②二分查找 O(log(n))
③哈希表 O(1)
④搜索树(平衡搜索树)
几种查找方式的比较:
哈希表实现线程安全还算容易,但树要实现线程安全不太容易
二、 AVL树
1、特点
AVL树必须是二叉树,必须是搜索树,任取树上节点且该节点的左右子树高度差不超过1(BF∈(-1,0,1))。是二叉搜索树的一种进化版本。
class AVLTreeNode{
Key key;
Value value;
AVLTreeNode left;
AVLTreeNode right;
int BalanceFactory;//平衡因子(BF) = 左子树高度-右子树高度
}
和普通搜索树的查找方式完全一致,只不过维护了平衡因子。
2、搜索树的旋转(不只是AVL树,只要是搜索树,都可以旋转)※
考虑通常情况下
1)左旋
- 左旋前:
- 左转后:
发现只有红线的指向关系发生了变化,根据分析代码如下:
private void leftRotate(Node parent){
Node parentOfParent = parent.parent;
Node right = parent.right;
Node leftOfRight = right.left;
right.parent = parentOfParent;
//需要明确原来的parent是parentOfParent的左或右,或他是否是根
if(parentOfParent==null){
//原来的根是parent
//现在是right
root = right;
}else