在 n 个动态的整数中搜索某个整数?(查看其是否存在)
假设使用动态数组存放元素,从第 0 个位置开始遍历搜索,平均时间复杂度:O(n)
。
如果维护一个有序的动态数组,使用二分搜索,最坏时间复杂度:O(logn)
。但是添加、删除的平均时间复杂度是 O(n)
。
针对这个需求,有没有更好的方案?
使用二叉搜索树,添加、删除、搜索的最坏时间复杂度均可优化至:O(logn)
。
一、二叉搜索树
二叉搜索树(Binary Search Tree,简称:BST)是二叉树的一种,是应用非常广泛的一种二叉树。又被称为:二叉查找树、二叉排序树。
特点:
- 任意一个节点的值都大于其左子树所有节点的值
- 任意一个节点的值都小于其右子树所有节点的值
- 它的左右子树也是一棵二叉搜索树
二叉搜索树存储的元素必须具备可比较性,比如int
、double
等。如果是自定义类型,需要指定比较方式(比如比较Person
的age
),但是元素不允许为null
。
二叉搜索树可以大大提高搜索数据的效率。
二、接口设计
1 | int size() // 元素的数量 |
需要注意的是二叉搜索树的元素没有索引的概念,因为索引是无效且无意义的。
2.1. 添加节点
比如添加12、1
添加步骤:
- 找到父节点
parent
- 创建新节点
node
parent.left = node
或者parent.right = node
代码:
1 | // 添加节点 |
遇到值相等的元素该如何处理?建议覆盖旧的值,因为比较自定义对象有可能仅仅是参与比较的元素值是相等的,其他属性都不一样。
2.2. 元素的比较方案设计
允许外界传入一个
Comparator
自定义比较方案。如果没有传入
Comparator
,强制认定元素实现了Comparable
接口。
1 | public BinarySearchTree() { |
2.3. 打印二叉树
推荐工具类:https://github.com/CoderMJLee/BinaryTrees
使用步骤:
- 实现
BinaryTreeInfo
接口 - 调用打印API:
BinaryTrees.println(bst);
推荐网站: