二叉树的继承者

时间:2014-05-27 23:29:31

标签: java binary-search-tree

class ElemDrzewa<T extends Comparable<T>>{

    final T elem;
    ElemDrzewa<T> lewy;
    ElemDrzewa<T> prawy;
    ElemDrzewa<T> rodzic;
    ElemDrzewa(T elem)
    {
        this.elem = elem;
        lewy = null;
        prawy = null;
    }


}

public class Drzewo<T extends Comparable<T>>{

    private ElemDrzewa<T> korzen;
    public Drzewo(){

        korzen = null;

    }

    public ElemDrzewa<T> search(T elem){

        ElemDrzewa<T> actual = korzen;
        while(actual!=null && actual.elem != elem)
            if(actual.elem.compareTo(elem)>0) actual = actual.lewy;
            else actual = actual.prawy;

            return actual;

    }

    private ElemDrzewa<T> min(ElemDrzewa<T> w){

        while(w.lewy != null)
        w = w.lewy;
        return w;
    }

    private ElemDrzewa<T> max(ElemDrzewa<T> w){

        while(w.prawy != null)
        w = w.prawy;
        return w;
    }

    private ElemDrzewa<T> nast(ElemDrzewa<T> w){

        if(w.prawy != null) return min(w.prawy);

        ElemDrzewa<T> tmp = w.rodzic;

        while(w!=null && w.lewy!= tmp)
        w = tmp;
        tmp = tmp.rodzic;
        return tmp;
    }

    private ElemDrzewa<T> poprz(ElemDrzewa<T> w){

        if(w.lewy != null) return max(w.lewy);

        ElemDrzewa<T> tmp = w.rodzic;

        while(w!=null && w.prawy!= tmp)
        w = tmp;
        tmp = tmp.rodzic;
        return tmp;
    }

    public ElemDrzewa<T> del(T elem){

        ElemDrzewa<T> w = this.search(elem);
        ElemDrzewa<T> rodzic = w.rodzic;
        ElemDrzewa<T> tmp;

        if(w.lewy!=null && w.prawy!=null){

            tmp = this.del(this.nast(elem).elem);
            tmp.lewy = w.lewy;
            if(tmp.lewy!=null)
            tmp.lewy.rodzic = tmp;
            tmp.prawy = w.prawy;
            if(tmp.prawy!=null)
            tmp.prawy.rodzic = tmp;
        }

        else{
            if(w.lewy!=null)    tmp = w.lewy;
            else tmp = w.prawy;
        }
        if(tmp!=null)   tmp.rodzic = rodzic;
        if(rodzic == null) korzen = tmp;
        else if(rodzic.lewy == w) rodzic.lewy = tmp;
        else rodzic.prawy = tmp;

        return w;
    }

}

这是我的代码,我对私人ElemDrzewa<T> nast(ElemDrzewa<T> w)

有疑问

错误为nast(ElemDrzewa<T>) in Drzewo<T> cannot be applied to (T) min是寻找最小值,max是最大值,nast for find succesor,poprz for find predecesor

2 个答案:

答案 0 :(得分:0)

您无法使用参数this.nast(ElemDrzewa<T> w)调用方法del中的elem,因为elem的类型为TT不属于ElemDrzewa<T>延长{{1}}。

答案 1 :(得分:0)

这一行:

    if(actual.elem.compareTo(elem)>0) actual = actual.lewy;

将无法编译,因为actual.elem具有类型T,并且编译器对T一无所知。并非所有Object都有compareTo个方法;为了使其工作,编译器需要知道T实现了Comparable。如果这是您的意图,那么您只能将此类用于实现Comparable的类型,请将第一行更改为

public class Drzewo<T extends Comparable<T>> {

编辑:现在已对原始帖子进行了编辑,以使该行看起来像这样,但不是原始提问者。所以我的答案可能也可能不相关。