Forum
>>
Principianti
>>
Inserimento di struttura dati (lista) all'interno di un albero
Pagina: 1
Esegui il login per scrivere una risposta.
Pagina: 1
Scritto da giuseppe giarratana |
2019-06-08 18:30:53 - Inserimento di struttura dati (lista) all'interno di un albero
|
Slave ragazzi! Ho un problema con il codice nel 'main'. Funziona perfettamente ma vorrei modificarlo per fare una cosa in particolare.
nel main istanzio un albero e lo chiamo 'T'. Poi creo una radice con elemento la stringa "Auto" tramite la riga: ' radice = T._add_root("Auto") '. Dopo, creata la lista ' lista ', creo il nodo figlio della radice che contiene la lista 'lista', la quale ha 3 elementi (In pratica è un albero generico che può avere più figli, usando come contenitore di tali figli una struttura dati, in questo caso un lista). Il mio obiettivo è creare un nuovo nodo (lista_opel, lista_citroen, lista_suzuki) che contenga una lista di elmenti, per ogni elemento della lista ' lista ' (in pratica questi nuovi nodi saranno i "nipoti" della radice). Il problema è che la lista 'lista_opel', e allo stesso modo le altre, diventa un nodo figlio dell'intero lista ' lista ' e non un nodo figlio di uno solo degli elementi della lista 'lista'. Vorrei creare qualcosa del genere: ecco l'immagine (scusate se non sono riuscito a inserirla ma era in locale e non su internet) https://drive.google.com/open?id=1qn1ZRBWmOaYEHzmktafmpRQGLJo6WJya come vedete dall'immagine il primo nodo ha un genitore "parent", un elemento "element" (New York) e 4 figli "children". I figli sono contenuti all'interno di una struttura dati e ogni elemento della struttura dati ha un nodo figlio con uguali caratteristiche. Ora, al posto di un nodo con un solo elemento, come quelli che contengono "Baltimore", "Chicago", "Providence", "Seattle", vorrei dei nodi che contengono delle liste. credo che il procedimento sia lo stesso ma non so davvero come realizzarlo. Ringrazio chiunque riesca ad aiutarmi lo apprezzerei davvero tanto. albero. albero_binario import Albero Binario class Albero Binario Concatenato(Albero Binario): class _Node: __slots__ = '_element', '_parent', '_child' def __init__(self, element, parent = None, child = None): self._element = element self._parent = parent self._child = child class Position(Albero Binario.Position): def __init__(self, container, node): self._container = container self._node = node def element(self): return self._node._element def __eq__(self, other): return type(other) is type(self) and other._node is self._node def _validate(self, p): if not isinstance(p, self.Position): raise TypeError('p deve essere di tipo position') if p._container is not self: raise ValueError('p non appartiene a questo contenitore') if p._node._parent is p._node: raise ValueError('p non è più valido') return p._node def _make_position(self, node): return self.Position(self, node) if node is not None else None def __init__(self): self._root = None self._size = 0 def __len__(self): return self._size def root(self): return self._make_position(self._root) def parent(self, p): node = self._validate(p) return self._make_position(node._parent) def child(self, p): node = self._validate(p) return self._make_position(node._child) def num_children(self, p): node = self._validate(p) count = 0 if node._left is not None: count += 1 if node._right is not None: count += 1 return count def _add_root(self, e): if self._root is not None: raise ValueError('la radice esiste') self._size = 1 self._root = self._Node(e) return self._make_position(self._root) def _add_child(self, p, e): node = self._validate(p) if node._child is not None: raise ValueError('ha già dei figli. I\n' 'figli devono essere ' 'contenuti in una ' 'struttura dati.') self._size += 1 node._child = self._Node(e, node) return self._make_position(node._child) def replace(self, p, e): node = self._validate(p) old = node._element node._element = e return old def _delete(self, p): node = self._validate(p) if self.num_children(p) == 2: raise ValueError('p ha 2 figli') child = node._left if node._left else node._right if child is not None: child._parent = node._parent if node is self._root: self._root = child else: parent = node._parent if node is parent._left: parent._left = child else: parent._right = child self._size -= 1 node._parent = node return node._element def _attach(self, p, t1, t2): node = self._validate(p) if not self.is_leaf(p): raise ValueError('la posizione deve essere una foglia') if not type(self) is type(t1) is type(t2): raise TypeError('gli alberi devono essere dello stesso tipo') self._size += len(t1) + len(t2) if not t1.is_empty(): t1._root._parent = node node._left = t1._root t1._root = None t1._size = 0 if not t2.is_empty(): t2._root._parent = node node._right = t2._root t2._root = None t2._size = 0 if __name__ == '__main__': print("\nALBERO GENERICO\n\n") T = Albero Binario Concatenato() if T.is_empty(): print("\nl'albero è vuoto\n") radice = T._add_root("Auto") print("l'elemento della radice è: ", radice.element()) lista = ["Opel", "Citroen", "Suzuki"] marche = T._add_child(radice, lista) print("figlio Auto: ", marche.element()) lista_opel = ["Astra", "Corsa", "Zafira", "Crossland X", "Agila"] lista_Citroen = ["C3", "C4", "C1", "Berlingo", "Cactus", "C-Zero"] lista_Suzuki = ["Jimny", "Swift", "Ignis", "Vitara", "Celerio", "Baleno"] figli_opel = T._add_child(marche, lista_opel) print("figlio di opel: ", figli_opel.element()) |
Pagina: 1
Esegui il login per scrivere una risposta.