放置TreeMap实现的方法

时间:2012-11-03 07:02:48

标签: java binary-search-tree treemap

我正在研究TreeMap的实现(称为MyTreeMap),我在使用put方法时遇到了很多麻烦。我希望有人可以查看我的代码并指出我正确的方向,以确定问题出现了什么。

public class MyTreeMap<K extends Comparable<? super K>,V> extends AbstractMap<K,V>  {

K key;
V value;
int height;
MyTreeMap<K,V> left,right;
int size;

public V put(K key, V value) {

    int compareValue = this.key.compareTo(key);

    if(!this.containsKey(key)) {
        if(this.key == null) {
            this.key = key;
            this.value = value;
        }

        if(this.isLeaf() || this.isEmpty()) {
            if(this.key.compareTo(key) > 0)
                this.left = new MyTreeMap<K,V>(key,value,null,null);
            else
                this.right = new MyTreeMap<K,V>(key,value,null,null);

            if(left.height > right.height + 1 || right.height > left.height + 1)
                restructure(this);
            this.size++;
            setHeight();
            return null;
        }
        else {
            if(compareValue > 0)
                return this.left.put(key, value);
            else
                return this.right.put(key, value);
        }
    }

    else {
        if(compareValue == 0) {
            V temp = this.value;
            this.value = value;
            return temp;
        }

        else if(compareValue < 0)
            return this.right.put(key, value);
        else 
            return this.left.put(key, value);
        }
}

1 个答案:

答案 0 :(得分:0)

我认为你的逻辑有点内外,因此比它需要的要复杂得多:顶级if应该看compareValue,而不是进行containsKey检查。

逻辑应该是:

  • 如果compareValue==0则表示您找到了正确的密钥,因此只需更新该值并返回
  • 否则视情况检查左侧或右侧分支(取决于compareValue的符号):
    • 如果分支为空,则将其转换为包含密钥和值的新TreeMap分支(现在已完成)
    • 否则(branch不为null),在此分支上递归调用put。如果您愿意,可以在此次通话后执行重新平衡逻辑。

P.S。我建议不要在TreeMap中允许空键,它会让你的生活更简单,并且不需要对键进行空检查