树结构:将数据使用树结构储存后,高效
- 二分搜索树
- 平衡二叉树
- 堆:并查集。
- 线段树:trie (字典树,前缀树)
当使用某些特定的数据结构存储问题之后,可以帮助我们更加高效的算法问题。
二叉树(多叉树):动态的数据结构。
二叉树具有唯一的根节点,每个节点最多有两个孩子节点,最多有一个父亲节点。每一个节点都有指向左和右。(左孩子,右孩子)
叶子节点(节点没有任何孩子)
二叉树具有天然的递归结构。每个节点的左子树,右子树也是二叉树。
二叉树不一定是满的。
二分搜索树(Binary Search Tree)
二分搜索树的每个节点的值,大于其左子树的所有节点的值,小于其右字数的所有节点的值。
每一颗子树也是二分搜索树。
存储的元素必须具有可比较性
向二分搜索树中添加元素:左小右大
暂时实现的二分搜索树不包含重复的元素,如果在某些运用中需要等于,只需要把等于关系放在关系里即可以。
public class BST<E extends Comparable<E>> {
public class Node {
private E e;
public Node left, right;
public Node(E e) {
this.e = e;
left = null;
right = null;
}
}
private Node root;
private int size;
public BST() {
root = null;
size = 0;
}
public int size() {
return size;
}
public boolean isEmpty() {
return size == 0;
}
public void add(E e) {
root = add(root, e);
}
// 向以node为根的二分搜索树中插入元素e,递归算法
// 返回插入新节点后二分搜索树的根
public Node add(Node node, E e) {
if (node == null) {
size++;
return new Node(e);
}
if (e.compareTo(node.e) < 0) {
node.left = add(node.left, e);
} else if (e.compareTo(node.e) > 0) {
node.right = add(node.right, e);
}
return node;
}
}
查询元素:
public boolean contains(E e) {
return contains(root, e);
}
// 看以node为根的二分搜索树中是否包含元素e
private boolean contains(Node node, E e) {
if (node == null)
return false;
if (e.compareTo(node.e) == 0) {
return true;
} else if (e.compareTo(node.e) < 0) {
return contains(node.left, e);
} else
return contains(node.right, e);
}