返回

使用 Java 手动实现 TreeMap

后端

前言

TreeMap 是 Java 中的一个数据结构,它允许您存储键值对,并根据键对值进行排序。这使得它非常适合存储和检索数据,例如用户数据或产品目录。

基本原理

TreeMap 使用红黑树来实现。红黑树是一种自平衡二叉搜索树,它可以保证在 O(log n) 的时间复杂度内进行查找、插入和删除操作。

手写实现

public class TreeMap<K extends Comparable<K>, V> {

    private Node<K, V> root;

    public void put(K key, V value) {
        root = put(root, key, value);
    }

    private Node<K, V> put(Node<K, V> node, K key, V value) {
        if (node == null) {
            return new Node<>(key, value);
        }

        int cmp = key.compareTo(node.key);
        if (cmp == 0) {
            node.value = value;
        } else if (cmp < 0) {
            node.left = put(node.left, key, value);
        } else {
            node.right = put(node.right, key, value);
        }

        return node;
    }

    public V get(K key) {
        Node<K, V> node = get(root, key);
        return node == null ? null : node.value;
    }

    private Node<K, V> get(Node<K, V> node, K key) {
        if (node == null) {
            return null;
        }

        int cmp = key.compareTo(node.key);
        if (cmp == 0) {
            return node;
        } else if (cmp < 0) {
            return get(node.left, key);
        } else {
            return get(node.right, key);
        }
    }

    public void remove(K key) {
        root = remove(root, key);
    }

    private Node<K, V> remove(Node<K, V> node, K key) {
        if (node == null) {
            return null;
        }

        int cmp = key.compareTo(node.key);
        if (cmp == 0) {
            if (node.left == null) {
                return node.right;
            } else if (node.right == null) {
                return node.left;
            } else {
                Node<K, V> successor = findMin(node.right);
                node.key = successor.key;
                node.value = successor.value;
                node.right = remove(node.right, successor.key);
            }
        } else if (cmp < 0) {
            node.left = remove(node.left, key);
        } else {
            node.right = remove(node.right, key);
        }

        return node;
    }

    public K firstKey() {
        return firstKey(root);
    }

    private K firstKey(Node<K, V> node) {
        if (node == null) {
            return null;
        }

        if (node.left == null) {
            return node.key;
        } else {
            return firstKey(node.left);
        }
    }

    public K lastKey() {
        return lastKey(root);
    }

    private K lastKey(Node<K, V> node) {
        if (node == null) {
            return null;
        }

        if (node.right == null) {
            return node.key;
        } else {
            return lastKey(node.right);
        }
    }

    public int size() {
        return size(root);
    }

    private int size(Node<K, V> node) {
        if (node == null) {
            return 0;
        }

        return 1 + size(node.left) + size(node.right);
    }

    private static class Node<K, V> {

        private K key;
        private V value;
        private Node<K, V> left;
        private Node<K, V> right;

        public Node(K key, V value) {
            this.key = key;
            this.value = value;
        }
    }
}

示例

以下是一个示例,展示如何使用 TreeMap 来存储和检索数据:

import java.util.TreeMap;

public class Main {

    public static void main(String[] args) {
        // 创建一个 TreeMap
        TreeMap<String, String> map = new TreeMap<>();

        // 向 TreeMap 中添加一些数据
        map.put("John", "123-456-7890");
        map.put("Mary", "987-654-3210");
        map.put("Bob", "456-789-0123");

        // 从 TreeMap 中获取数据
        String phoneNumber = map.get("John");
        System.out.println(phoneNumber); // 输出:123-456-7890

        // 遍历 TreeMap
        for (String key : map.keySet()) {
            String value = map.get(key);
            System.out.println(key + ": " + value);
        }
    }
}

结论

手动实现 TreeMap 可以帮助您更好地理解 TreeMap 的原理和实现。如果您需要使用 TreeMap 来存储和检索数据,那么本文中的实现可以为您提供帮助。