算法与数据结构(15)—— 二叉树的基础,节点插入,查找

二分搜索树

常见的应用:字典数据结果, 以键值对形成了表。


  • 每个节点的键值大于左孩子,小于右孩子。
  • 二分搜索树可以不是一颗完全二叉树,堆是一颗完全的二叉树。


代码实现:
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);
        }
    }

        实现的二分搜索树中不是平衡二叉树,如果按照顺序插入一组数据,最坏情况的话可能退化成为一个链表,这样的话推广就是红黑树~

猜你喜欢

转载自blog.csdn.net/Jae_Wang/article/details/80611196