《算法》笔记-3.2二叉查找树
来源:互联网 发布:金属徽章定制价格淘宝 编辑:程序博客网 时间:2024/06/14 11:37
3.2 二叉查找树
二叉查找树(BST):是一棵二叉树,每个结点都含有一个Comparable的键(以及相关联的值),每个结点的键都大于其左子树中的任意结点的键,小于其右子树的任意结点的键。
一棵二叉查找树代表一组键和值的集合,同一个集合可以用不同的二叉查找树表示。
中序遍历二叉树,是键值从小到大的排序。
3.2.1 基本实现
二叉树的数据表示:
每个结点包含一个键、
一个值、
一条左链接(小于该结点的所有键组成的二叉树)、
一条右链接、
一个结点计数器(N:以该节点为根节点的子树中的结点总数);
root变量指向根节点Node对象;
二叉树的查找get()算法:(递归)
如果树是空的,则查找未命中;
如果查找的键和根节点的键相等,则命中;
否则在适当的子树中继续查找;
递归调用后的代码,对应这一系列的return指令;
二叉树的插入put()算法:(递归,与get相似)
如果树是空的,则返回一个含该键值对的新结点;
如果查找的键小于根节点的键,在左子树中插入该结点,如果查找的键大于根节点的键,在右子树中插入该结点;
如果查找的键等于根节点的键,则修改值;
递归调用后的代码,对应这重置搜索路径上每个结点的计数器N;
代码如下:
public class BST<Key extendsComparable<Key>,Value> { private Noderoot; private class Node{ private Key key; private Value val; private Nodeleft,right; private int N;//以该节点为根的子树中节点的总数 public Node(Key key, Value val,int N){ this.key = key; this.val = val; this.N = N; } } public int size(){ return size(root); } public int size(Nodex){ if(x == null) return 0; else return x.N; //return size(x.left) + size(x.right) + 1; } public Valueget(Key key){ return get(root,key); } private Value get(Node x, Key key){ //以x为根节点找key对应的val if(x == null) return null; int cmp =key.compareTo(x.key); if(cmp< 0)return get(x.left, key); else if(cmp> 0)return get(x.right, key); else return x.val; } public void put(Key key, Valueval){ root = put(root, key, val); } private Nodeput(Node x, Key key, Value val){ //查找key,找到则更新它的值,否则为它创建新的节点 if(x == null) return new Node(key,val, 1); int cmp =key.compareTo(x.key); if(cmp< 0) x.left =put(x.left,key,val); else if(cmp> 0) x.right =put(x.right,key,val); else x.val = val; //沿着查找路径重置每个节点的N x.N =size(x.left) + size(x.right) + 1; return x; }}
3.2.2 分析
二叉查找树的算法运行时间取决于树的形状,树的形状取决于键被插入的先后顺序
最好的情况是树是完全二叉树,最坏是只有左子树或只有右子树,一般情况是介于两者之间;
假设键的分布均匀,或者说键的插入顺序是随机的,那么树的根节点相当于快排算法的第一个切分元素(左侧键比它小,右侧键比它大)
在由N个随机键构造的二叉查找树中,查找命中平均所需的比较次数为~2
在由N个随机键构造的二叉查找树中插入操作和查找未命中平均所需的比较次数为~2
3.2.3 有序性相关的方法与删除操作
3.2.3.1最大最小键
如果根节点的左链接为null,那么一棵二叉查找树中最小的键是根节点;
如果左链接为非null,那么树中的最小键是左子树中的最小键
3.2.3.2向上取整和向下取整
如果给定的键key小于二叉查找树的根节点的键,那么小于等于key的最大键floor(key)一定在根节点的左子树上;
如果给定给定键key大于二叉查找树的根节点,那么只有当根节点右子树中存在小于等于key的节点时,小于等于key的最大键才在右子树上;否则就是根节点;
3.2.3.3选择操作
找到排名为k的键(从开始排名,即正好有k个小于它的键);
如果左子树中的结点数t大于k,就递归地在左子树中查找排名为k的键;
如果左子树中的节点数t等于k,则返回根节点中的键;
如果t小于k,则递归地在右子树中查找排名为k-t-1的键;
3.2.3.4排名
返回给定键的排名
如果给定键和根节点的键相等,则返回左子树中的节点总数t;
如果给定键小于根节点,返回递归计算的左子树中的排名;
如果给定键大于根节点,返回递归计算的右子树中的排名+t+1;
- 《算法》笔记-3.2二叉查找树
- 《算法》笔记-3.2二叉查找树(2)
- 二叉查找树 算法导论笔记
- 算法系列笔记3(二叉查找树)
- 笔记-二叉查找树
- 算法(3.2 二叉查找树)
- 算法导论学习笔记——二叉查找树
- 《算法导论》学习笔记--第十二章 二叉查找树
- 算法导论学习笔记(八):二叉查找树
- 《算法导论》笔记 第12章 12.1 二叉查找树
- 最优二叉查找树详解(算法导论学习笔记)
- 查找算法 顺序查找 二分查找 二叉树查找 算法
- 算法之二叉查找树
- 算法学习--二叉查找树
- 算法导论 二叉查找树
- 二叉树的查找算法
- 算法 操作二叉查找树
- 算法-二叉查找树
- CSS标签选择器
- javascrip的一些基本操作
- leetcode -- 442. Find All Duplicates in an Array 【数组随机性 + 数据特点 + 整数符号位使用】
- POJ 1024--Tester Program
- Mybatis源码分析-执行模块
- 《算法》笔记-3.2二叉查找树
- 【机器学习杂货铺】——线性模型和非线性模型(暂缺)
- Android 7.1 icu4c(icudt56l.dat)编译
- 数据库多个触发器的连续执行
- 正则表达式详解
- 剑指offer——二进制中1的个数
- MySQL基础(6)——插入数据、更新和删除数据
- Barra 结构化风险模型实现(1)——沪深300指数的风格因子暴露度分析
- Jetson TX2 如何搭建opencv3.2+cuda8.0