2

首先,我搜索了 java 中泛型类型的用法,但是我发现的答案太简单或太复杂了。所以这是我的确切问题。

我有三个类,分别是 PerfectTreeControl、Tree 和 Entry。

树有

public class Tree<K> {
  public Entry <K> root;

条目有

public class Entry<K> {
    public K element;
    public Entry<K> parent, left_child, right_child;


    public Entry(K element) {
        this.element = element;
    }
    public Entry(K element, Entry<K> left, Entry<K> right) {
        left_child = left;
        right_child = right;
        this.element = element;
    }

我想了解 Entry 父级和 Entry <K> 父级之间的区别是什么?我知道它K element 可以用作整数、字符串或我想要的任何东西,但是对象也一样吗?我尝试使用不带参数的 Entry 变量,它只说 Entry 是原始类型,应该进行参数化,并且它仍然可以正常工作。

我的第二个问题是关于检查一棵树是否完美。以下是我到目前为止尝试过的一些代码:

public class PerfectTreeControl {

    public static boolean isPerfect(Tree<String> tree) {
        Tree t1 = new Tree();
        if( t1.isFull( tree.root ) ) {  
            int depth = t1.height(tree.root);
            return t1.everyLeafHasSameDepth(tree.root, depth);
        } 
        else 
            return false;
    }   
    }





public class Tree<K> {
    public Entry <K> root;

    public boolean isLeaf(Entry e) {
        return e.left_child == null &&
                e.right_child == null;
    }

    public int height(Entry  e) {
        if( e == null ||
                e.left_child == null &&
                e.right_child == null ) 
            return  0;
        int left = height( e.left_child );
        int right = height( e.right_child );

        return 1 + Math.max(left, right);
    }

    public boolean isFull(Entry base) {
        if( isLeaf(base) )
            return true;
        else
            if( base.left_child != null && base.right_child != null ) {
                return isFull(base.left_child) &&
                        isFull(base.right_child);
            } else {
                return false;
            }
    }


    public  int depth(Entry e) {
        if( e == root ) {
            return 0;
        } else {
            return 1 + depth(e.parent);
        }
    }

    public  boolean everyLeafHasSameDepth(Entry base, int depth) {
        if( base == null ) 
            return false;
        else if(isLeaf(base) ) 
            return depth( base ) == depth;
        else {
            return 
                    everyLeafHasSameDepth(base.left_child, depth) &&
                    everyLeafHasSameDepth(base.right_child, depth);
        }
    }
  • 入口类(我写在页首) 如您所见,PerfectTreeControl 类中的 isPerfect 方法使用 Tree -String-tree 作为参数,我不知道它是什么。在 Tree 类中,我尝试了 Entry 并且一次又一次没有区别。代码不能正常工作,我完全糊涂了。
4

1 回答 1

3

Java 中的泛型从根本上说是一种在对象中命名特定类的方法,在声明该对象之前知道哪个类。这很有用,因为它允许编译器在对该类的引用之间强制执行一致性。

更具体地说,在你的 classEntry<K>中,任何时候你引用K,Java 编译器都会强制 type 的所有引用K实际上都被视为 type K。例如,如果您创建一个类型为 的对象,则该对象的成员必须为 类型Entry<String>,该成员必须为 类型等。如果您有一个返回 a 的方法,编译器将识别出返回值为。如果编译器在这里看到不一致的地方——比如说,如果你尝试将' 的值设置为an——它会抱怨。 elementStringparentEntry<String>KStringmemberInteger

请记住,我在上面的示例中描述的品质都是针对Entry<String>您定义的特定对象的。如果您改为定义一个Entry<Integer>,而不更新您的Entry类,则在该新对象中强制执行一致性 - 除非这次是K有意义Integer的。

如果您创建一个对象而不为 指定类型参数K,则您使用的是“原始类型”。这可以防止编译器强制执行一致性规则,它会假定类型KObject。这意味着您将不得不开始担心演员阵容,这可能会很乏味。

要检查一棵树是否已满(或“完美”),最直观的方法是递归方法。在这种情况下使用的递归规则是“如果一棵树的孩子是完美的并且具有相同的深度,那么这棵树就是完美的。”

于 2012-06-30T22:43:21.107 回答