一、Set和Map
1. Set
- 核心特点
- 无序性:元素存储顺序无规则 ,如 {1, 2, 3} 和 {3, 2, 1} 的Set是等价的,与有序的List不同。
- 不可修改性:不能直接修改元素,若要修改需删除旧元素插入新元素。
- 不重复性:不会保存重复元素。
- 接口与实现类: Set 是接口,常见实现类有 TreeSet (基于树形结构,通常是二叉搜索树相关 )和 HashSet (基于哈希表 ) 。
- 核心操作: add (添加元素)、 remove (删除元素)、 contains (判断元素是否存在)。主要应用场景是判断元素是否存在,如奖学金名单场景。
- 代码示例(Java)
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
public class SetExample {
public static void main(String[] args) {
// 使用TreeSet
Set<String> set = new TreeSet<>();
set.add("apple");
set.add("banana");
set.add("cherry");
System.out.println("TreeSet: " + set);
// 使用HashSet
Set<String> set2 = new HashSet<>();
set2.add("apple");
set2.add("banana");
set2.add("cherry");
System.out.println("HashSet: " + set2);
// 判断元素是否存在
System.out.println("Contains apple in TreeSet: " + set.contains("apple"));
System.out.println("Contains apple in HashSet: " + set2.contains("apple"));
// 删除元素
set.remove("banana");
set2.remove("banana");
System.out.println("TreeSet after remove: " + set);
System.out.println("HashSet after remove: " + set2);
}
}
2. Map
- 与Set的关系:类似于Set,但Set保存“键”,Map保存“键值对” 。
- 特点: key 唯一、无序且不可修改; value 无特殊要求。插入顺序不影响最终元素保存顺序,若 put 时 key 已存在则修改 value 。
- 相关概念
- keySet :将所有 key 收集成一个Set。
- entrySet :将所有 key - value 收集成一个Set, entry 表示条目 。
- 核心操作: get (根据 key 获取 value )、 put (插入或修改键值对 )、 remove (根据 key 删除键值对 ) 。
- 代码示例(Java)
import java.util.HashMap;
import java.util.Map;
public class MapExample {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("及时雨", "宋江");
map.put("黑旋风", "李逵");
map.put("小李广", "花荣");
System.out.println("Map: " + map);
// 根据key获取value
System.out.println("Get value by key '及时雨': " + map.get("及时雨"));
// 修改value
map.put("黑旋风", "李鬼");
System.out.println("Map after modify: " + map);
// 删除键值对
map.remove("小李广");
System.out.println("Map after remove: " + map);
// 遍历keySet
for (String key : map.keySet()) {
System.out.println("Key: " + key);
}
// 遍历entrySet
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}
}
}
二、二叉搜索树
1. 定义与性质
- 是特殊二叉树,对任意节点,若左子树不为空,左子树所有 key 小于根节点 key ;若右子树不为空,右子树所有 key 大于等于根节点 key 。
- 查找类似二分方式,若根节点 key 等于查找 key ,返回 true ;若根节点 key 大于查找 key ,在左子树查找;若根节点 key 小于查找 key ,在右子树查找 。
2. 时间复杂度:
最坏情况O(N)(树退化为链表状 ),理想情况(平衡二叉搜索树 )O(logN) 。
3. 节点删除操作
- 无左右子树:直接删除。
- 只有左子树:将左子树接到父节点对应位置。代码示例(Java) :
if (cur == parent.left) {
parent.left = cur.left;
} else {
parent.right = cur.left;
}
- 只有右子树:将右子树接到父节点对应位置。代码示例(Java) :
if (cur == parent.left) {
parent.left = cur.right;
} else {
parent.right = cur.right;
}
- 有左右子树:找到待删除节点右子树中最左侧元素(或左子树中最右侧元素 ),用其值替换待删除节点值,再删除该元素。
三、平衡二叉搜索树
1. 平衡条件:针对任意节点,左右子树高度差不超过1 ,避免单枝极端情况,提高查找效率 。
2. AVL树:严格平衡,查找快,但插入删除易打破平衡,调整频繁影响效率,实用性较差 。
3. 红黑树:平衡要求更均衡,通过系列规则定义,代码实现复杂,插入考虑多种情况,但实用价值高 。