二分搜索树—(RBTree)—TreeMap / TreeSet
哈希表 —HashSet / HashMap
Map接口(映射关系)
存储键值对。
Map接口常见子类添加问题
Set
披着Set外衣的Map,也是collection接口的子接口。
collection接口: 线性表接口一次保存一个元素 ,其子类的都可以进行for-each循环
和List集合区别: Set 集合保存的元素不能重复
【使用Set集合去重处理】
搜索树
1、搜索树有哪些?–>RBTree、AVL(平衡BST)、2-3树、B树等等
2、概念:
BST:二分搜索树/二叉搜索树/二叉排序树
1、是二叉树
2、节点严格要求:每个树的左子树值<树根节点值<所有右子树值
JDK中BST不存在重复节点!!!
3、存储的节点必须具备可比较的能力(实现Compara接口或者传入比较器)
3、向BST添加一个节点:
【新添加的数一定是在叶子节点操作】
时间复杂度:平均logn
最坏 n–单支数
/**
* 添加一个新节点
*
* @param val
*/
public void add(int val) {
root = add(root, val);
}
/**
* 向当前以root为根的BST中插入一个新元素 ,返回插入后的根
*
* @param root
* @param val
* @return
*/
private Node add(Node root, int val) {
if (root == null) {
Node node = new Node(val);
size++;
return node;
}
if (val < root.val) {
root.left = add(root.left, val);
}
if (val > root.val) {
root.rigth = add(root.rigth, val);
}
return root;
}
4、判断value是否在BST中
平均:logn
最坏:n
/**
* 判断BST中是否存在值为value的节点
*
* @param val
* @return
*/
public boolean contains(int val) {
return contains(root, val);
}
/**
* 传入一个根节点和val判断该节点是否存在
*
* @param root
* @param val
* @return
*/
private boolean contains(Node root, int val) {
if (root == null) {
return false;
}
if (root.val == val) {
return true;
} else if (val < root.val) {
return contains(root.left, val);
} else {
return contains(root.rigth, val);
}
}
5、按照先序遍历打印BST
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
generateBSTString(root, 0, sb);
return sb.toString();
}
/**
* 按照先序遍历,将BST节点值存于sb中
*
* @param root
* @param height
* @param sb
*/
private void generateBSTString(Node root, int height, StringBuilder sb) {
if (root == null) {
sb.append(generateHeightStr(height)).append("Null\n");
return;
}
sb.append(generateHeightStr(height)).append(root.val).append("\n");
generateBSTString(root.left, height + 1, sb)