二分搜索树
常见的应用:字典数据结果, 以键值对形成了表。
- 每个节点的键值大于左孩子,小于右孩子。
- 二分搜索树可以不是一颗完全二叉树,堆是一颗完全的二叉树。
代码实现:
public class BST<Key extends Comparable<Key>, Value> { // 树中的节点为私有的类, 外界不需要了解二分搜索树节点的具体实现 private class Node { private Key key; private Value value; private Node left, right; public Node(Key key, Value value) { this.key = key; this.value = value; left = right = null; } } private Node root; // 根节点 private int count; // 树种的节点个数 // 构造函数, 默认构造一棵空二分搜索树 public BST() { root = null; count = 0; } // 返回二分搜索树的节点个数 public int size() { return count; } // 返回二分搜索树是否为空 public boolean isEmpty() { return count == 0; } }
插入函数 insert:
- 判断node是否为空,为空则创建并将其返回(判断递归到底的情况)。
- 如不为空则一直判断,当相等直接更新value的值,不相等的话继续递归比较左右孩子的部分。
//向二分搜索树中插入一个新的(key,value)数据对,返回的是根节点 public void insert(Key key, Value value){ root = insert(root, key, value); } private Node insert(Node node, Key key, Value value){ if(node == null){ count ++; return new Node(key, value); } if(key.compareTo(node.key) == 0){ node.value = value; }else if(key.compareTo(node.key) 》 0){ node.left = insert(node.left, key, value); }else { node.right = insert(node.right, key, value); } return node; }
查找函数select
- boolean contain(key):查看二分搜索树中是否存在键key
- Value search(key):二叉树中查找key键的值,如果不存在就返回null
//查看二叉树中包含key public boolean contain(Key key){ return contain(root, key); } private boolean contain(Node node, Key key){ if(node == null){ return false; } if(key.compareTo(node.key) == 0){ return true; }else if(key.compareTo(node.key) < 0){ return contain(node.left, key); }else { return contain(node.right, key); } }
//二叉树中搜索键key对应的值,如果key不存在,则返回null public Value search(Key key){ return search(root, key); } private Value search(Node node, Key key){ //以node为根,,搜索key所对应的value if(node == null){ return null; } if(key.compareTo(node.key) == 0){ return node.value; }else if(key.compareTo(node.key) > 0){ return search(node.right, key); }else { return search(node.left, key); } }
实现的二分搜索树中不是平衡二叉树,如果按照顺序插入一组数据,最坏情况的话可能退化成为一个链表,这样的话推广就是红黑树~