You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java TreeMap实现中的类型不匹配错误:方法参数不适用

Java TreeMap实现中的类型不匹配错误修复

问题背景

我尝试用Java实现一个基于平衡二叉树的TreeMap,但多个方法出现类型不匹配错误:getMax、height、getBalanceFactor、leftRotate和rightRotate方法都提示“参数不适用于该方法”,尽管看起来方法签名和参数是匹配的。

现有代码

TreeMap.java

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class TreeMap<K, V> {
    private TreeNode<Pair<K, V>> root;

    TreeMap() {
        root = null;
    }

    public void delete(Pair<K, V> data) {
        root = delete(root, data);
    }

    private static <K, V> TreeNode<Pair<K, V>> delete(TreeNode<Pair<K, V>> root, Pair<K, V> data) {
        if (root == null) {                                                 // empty tree
            return root;
        }
        if (data.compare(root.data) == 0 ) {                                // target on left side of tree
            root.left = delete(root.left, data);
        } else if (data.compare(root.data) > 0) {                           // target on right side of tree
            root.right = delete(root.right, data);
        } else if (root.left == null || root.right == null) {               // root is target, but less than two children
            root = root.left != null ? root.left : root.right;
        } else {                                                            // root is target, but two children
            root.data = getMax(root.left);
            root.left = delete(root.left, root.data);
        }
        if (root == null) {
            return root;
        }
        root.height = Math.max(height(root.left), height(root.right)) + 1; // update height for balanceFactor purpose
        int rootBalanceFactor = getBalanceFactor(root);
        if (rootBalanceFactor > 1) {                                        // if left subtree is unbalanced
            int leftBalanceFactor = getBalanceFactor(root.left);
            if (leftBalanceFactor < 0) {                                    // make sure balanceFactor of left node >= 0
                root.left = leftRotate(root.left);
            }
            root = rightRotate(root);
            return root;
        }
        if (rootBalanceFactor < -1) {                                       // if right subtree is unbalanced
            int rightBalanceFactor = getBalanceFactor(root.right);
            if (rightBalanceFactor > 0) {                                   // make sure balanceFactor of right node <= 0
                root.right = rightRotate(root.right);                       
            }
            root = leftRotate(root);
            return root;
        }
        return root;
    }

    private Pair<K, V> getMax(TreeNode<Pair<K, V>> root) {
        if (root == null) {
            return null;
        }
        if (root.right == null) {
            return root.data;
        }
        Pair<K, V> result = getMax(root.right);
        return result;
    }

    public boolean search(Pair<K, V> data) {
        boolean result = search(root, data);
        return result;
    }

    private boolean search(TreeNode<Pair<K, V>> root, Pair<K, V> data) {
        if (root == null) {
            return false;
        }
        if (data.compare(root.data) < 0) {
            boolean result = search(root.left, data);
            return result;
        }
        if (data.compare(root.data) > 0) {
            boolean result = search(root.right, data);
            return result;
        }
        return true;
    }

    public void insert(Pair<K, V> data) {
        root = insert(root, data);
    }

    private TreeNode<Pair<K, V>> insert(TreeNode<Pair<K, V>> root, Pair<K, V> data) {
        if (root == null) {                                                 // create new node at target location
            return new TreeNode<Pair<K, V>>(data);
        }
        if (data.compare(root.data) < 0) {                                  // target in left subtree
            root.left = insert(root.left, data);
        } else if (data.compare(root.data) > 0) {                           // target in right subtree
            root.right = insert(root.right, data);     
        } else {                                                            // target already exists
            return root;
        }
        root.height = Math.max(height(root.left), height(root.right)) + 1; // update height for balanceFactor purpose
        int rootBalanceFactor = getBalanceFactor(root);
        if (rootBalanceFactor > 1) {                                        // if left subtree is unbalanced
            if (data.compare(root.left.data) > 0) {                         // LR case
                root.left = leftRotate(root.left);
            }
            root = rightRotate(root);                                       // right rotation necessary in both cases
            return root;
        }
        if (rootBalanceFactor < -1) {                                       // if right subtree is unbalanced
            if (data.compare(root.right.data) < 0) {                        // RL case
                root.right = rightRotate(root.right);
            }
            root = leftRotate(root);                                        // left rotation necessary in both cases
            return root;
        }
        return root;
    }
    
    private int getBalanceFactor(TreeNode<Pair<K, V>> root) {
        if (root == null) {
            return 0;
        }
        int result = height(root.left) - height(root.right);
        return result;
    }

    private int height(TreeNode<Pair<K, V>> root) {
        if (root == null) {
            return -1;
        }
        return root.height;
    }

    private TreeNode<Pair<K, V>> leftRotate(TreeNode<Pair<K, V>> root) {
        if (root == null) {
            return root;
        }
        if (root.right == null) {
            return root;
        }
        TreeNode<Pair<K, V>> rightChild = root.right;
        root.right = rightChild.left;
        rightChild.left = root;
        root.height = Math.max(height(root.left), height(root.right)) + 1;
        rightChild.height = Math.max(height(rightChild.left), height(rightChild.right)) + 1;
        return rightChild;
    }

    private TreeNode<Pair<K, V>> rightRotate(TreeNode<Pair<K, V>> root) {
        if (root == null) {
            return root;
        }
        if (root.left == null) {
            return root;
        }
        TreeNode<Pair<K, V>> leftChild = root.left;
        root.left = leftChild.right;
        leftChild.right = root;
        root.height = Math.max(height(root.left), height(root.right)) + 1;
        leftChild.height = Math.max(height(leftChild.left), height(leftChild.right)) + 1;
        return leftChild;
    }
}

Pair.java

public class Pair<K, V> {
    K key;
    V value;

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

    public int compare(Pair<K, V> pair1) {
        return this.hashCode() - pair1.hashCode();
    }

    @Override
    public int hashCode() {
        return this.key.hashCode();
    }
}

TreeNode.java

public class TreeNode<T> {
    public T data;
    int height;
    public TreeNode<T> left, right;

    public TreeNode(T data) {
        this.data = data;
        height = 0;
        left = right = null;
    }
}

错误原因分析

  1. 静态方法调用实例方法:delete方法被声明为static <K, V>,而getMax、height等方法都是TreeMap类的非静态实例方法。静态方法无法直接调用实例方法,且静态方法的泛型参数<K, V>与类的泛型参数<K, V>是完全独立的,导致编译器认为参数类型不匹配。
  2. delete方法逻辑错误:原代码中条件判断写反了——当data.compare(root.data) == 0时应该处理目标节点的删除,而不是递归左子树,这会导致删除逻辑完全错误。

修复方案

1. 移除delete方法的static修饰符

将delete方法改为实例方法,这样它就能正确调用其他非静态方法,且泛型参数与类保持一致:

private TreeNode<Pair<K, V>> delete(TreeNode<Pair<K, V>> root, Pair<K, V> data) {
    // 原逻辑修正后内容...
}

2. 修正delete方法的条件判断逻辑

把节点查找的逻辑调整正确:

private TreeNode<Pair<K, V>> delete(TreeNode<Pair<K, V>> root, Pair<K, V> data) {
    if (root == null) {
        return root;
    }
    // 目标在左子树
    if (data.compare(root.data) < 0) {
        root.left = delete(root.left, data);
    } 
    // 目标在右子树
    else if (data.compare(root.data) > 0) {
        root.right = delete(root.right, data);
    } 
    // 找到目标节点,处理删除
    else {
        // 节点只有一个子节点或没有子节点
        if (root.left == null || root.right == null) {
            root = root.left != null ? root.left : root.right;
        } 
        // 节点有两个子节点,找左子树最大值替代
        else {
            root.data = getMax(root.left);
            root.left = delete(root.left, root.data);
        }
    }

    if (root == null) {
        return root;
    }

    // 更新高度和平衡因子,处理旋转
    root.height = Math.max(height(root.left), height(root.right)) + 1;
    int rootBalanceFactor = getBalanceFactor(root);
    
    // LL或LR旋转
    if (rootBalanceFactor > 1) {
        int leftBalanceFactor = getBalanceFactor(root.left);
        if (leftBalanceFactor < 0) {
            root.left = leftRotate(root.left);
        }
        return rightRotate(root);
    }
    
    // RR或RL旋转
    if (rootBalanceFactor < -1) {
        int rightBalanceFactor = getBalanceFactor(root.right);
        if (rightBalanceFactor > 0) {
            root.right = rightRotate(root.right);
        }
        return leftRotate(root);
    }
    
    return root;
}

3. 优化Pair类的比较逻辑(可选但必要)

原Pair类的compare方法基于hashCode,容易出现冲突,且不符合TreeMap按key排序的需求。应该让K实现Comparable接口,修改Pair类:

public class Pair<K extends Comparable<K>, V> {
    K key;
    V value;

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

    public int compare(Pair<K, V> pair1) {
        return this.key.compareTo(pair1.key);
    }

    @Override
    public int hashCode() {
        return this.key.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Pair<?, ?> pair = (Pair<?, ?>) obj;
        return key.equals(pair.key);
    }
}

同时TreeMap类的泛型也需要对应调整:

public class TreeMap<K extends Comparable<K>, V> {
    // ... 原有代码 ...
}

总结

通过移除delete方法的static修饰符并修正逻辑,解决了类型不匹配的核心问题;优化Pair类的比较逻辑,让TreeMap的排序和查找逻辑更可靠。

内容的提问来源于stack exchange,提问作者Thorfinn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 13:55:18