2012-04-22 2 views
1

Если у меня есть класс узла (ов), который может принимать общий тип для его значения ключа:Объявить двоичное дерево, которое принимает общий тип узла, который содержит общий тип значения ключа?

class Node<K extends Comparable<K>> implements Comparable<Node<K> { 
    ... 
} 

class KeyValueNode<K extends Comparable<K>, V> extends Node<K> { 
    ... 
} 

Можно ли объявить общий двоичный класс дерева, который принимает общий тип узла, который может содержать общий тип ключевого значения? Я думал, что это будет выглядеть примерно так ....

class BinaryTree<N<K>> { 
    N<K> root; 
    BinaryTree<N<K>> left, right; 
    ... 
} 

Извинения для любых явных недоразумений, я все еще пытаюсь освоиться воспроизведенных и синтаксис Java, был бы весьма признателен за любую помощь или понимание.

Спасибо!

ответ

1

Бинарная древовидная структура будет по существу просто содержать ссылку на корневой узел. Поэтому она должна иметь те же параметры типа, как его узлы:

class BinaryTree<K extends Comparable<K>> { 

    Node<K> root; 
} 

Или для дизайна ключ-значение:

class KeyValueBinaryTree<K extends Comparable<K>, V> { 

    KeyValueNode<K, V> root; 
} 

Заметим, что это спорный вопрос, необходимо ли объемлющей класс дерево, так как это узлы которые указывают друг на друга.

+0

Спасибо за ясный ответ Пол. Возможно ли, однако, сделать тип узла общим? У меня есть что-то вроде этого: class BinaryTree , K extends Comparable > { Как бы то ни было, это провалилось, как только я попытался указать конкретные методы вставки для разных типов узлов – xlm

0

Вы можете сказать:

class BinaryTree<N extends Node<N>> { 
    Node<N> root; 
    // or even better: N root; 
    BinaryTree<N> left, right; 
} 

Имея BinaryTree<Node<K>> это не параметризуя класс как the purpose of defining a generic type.

+0

Не знаете, почему 'N' будет самореализоваться. –

+0

Какое место точно? 'BinaryTree' параметризуется на некотором' N', который должен быть экземпляром/расширением 'Node'' N'. – nobeh

+0

Не должно ли дерево содержать узлы некоторого типа «Comparable», а не узлы узлов узлов ...? –

0

Это, как я хотел бы написать общий бинарное дерево класс

public class BinaryTree<N extends Node<K>, K extends Comparable> { 
    N root; 
    BinaryTree<N, K> left, right; 
} 

(Хотя я предполагаю, что вы бы на самом деле не рассказ BinaryTree в бинарном дереве, и это было просто для вашего примера, чтобы показать, как это может быть объявлено)

+0

Почему нет хорошей идеи иметь BinaryTree содержать узел и левый и правый BinaryTree? – xlm

Смежные вопросы