Nadesłany przez Jakub Konieczny, 07 kwietnia 2011 17:53
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
drzewo_1_py.py:
#!/usr/bin/python # -*- coding: utf-8 -*- #www.algorytm.org # Cała struktura drzewa jest zrealizowana w jednej klasie # Węzeł jest podstawową jednostką drzewa, jest nim zarówno korzeń, jak i liście # Jeden węzeł może należeć tylko do jednego drzewa. Dlatego lista dzieci, jak # i referencja do rodzica są prywatne, a zarządzaniem przenależności # zajmują się odpowiednie metody, które usuwają ewentualne połączenie #ze starym drzewem # Automatycznie każdy węzeł po utworzeniu jest korzeniem (brak rodzica) # Każdy korzeń jest również węzłem (posiada dzieci) import os class Node: def __init__(self, name="Node", parent=None): self.__parent__=parent self.__childs__=[] self.name=name #nazwa def isRoot(self): #jest korzeniem, czy nie posiada rodzica if self.__parent__==None: return True return False def isNode(self): #jest węzłem, posiada dzieci if len(self.__childs__)>=1: return True return False def getParent(self): return self.__parent__ def getChilds(self): return self.__childs__ def getNext(self): #następny (sąsiad) węzeł z tym samym rodzicem if self.__parent__==None: return None n=self.__parent__.getChilds() this=False for child in n: if this and child!=self: return child if child==self: this=True return None def getPrev(self): #poprzedni węzeł z tym samym rodzicem if self.__parent__==None: return None n=self.__parent__.getChilds() p=None for child in n: if child==self: return p p=child return None def removeChild(self, remove): #usuwa z listy dzieci podany węzeł if remove in self.__childs__: self.__childs__.remove(remove) def setParent(self, newParent): #przypisuje węzłowi nowego rodzica if newParent.__class__!= Node: return None if self.__parent__!=None: #jeśli miał rodzica self.__parent__.removeChild(self) #usuwa się z niego self.__parent__=newParent #i ustawia nowego newParent.addChild(self) #oraz dodaje się do listy jego dzieci def addChild(self, newChild): #dodaje dziecko do węzła if newChild.__class__!= Node: return None if newChild in self.__childs__: return None if newChild.getParent()!=None: newChild.getParent().removeChild(newChild) #wcześniej musi jednak # usunąć je od poprzedniego rodzica self.__childs__.append(newChild) newChild.__parent__=self def getRoot(self): #szuka korzeni root=self while root.isRoot()==False:#pobiera kolejnych rodziców tak długo, aż trafi root=root.getParent() return root def printTree(self, intend=0): # metoda rysuje całe drzewo od obecnego elementu p="" # z podanym wcięciem (zaczynając od 0) i=intend while i>0: if i>1: p+=" +" else: p+=" "; i-=1 #generowanie wcięcia if(self.isNode()): print(p+"+"+self.name) #jeśli ma dzieci, rysuje + else: print(p+"-"+self.name) #nie posiada, - for c in self.getChilds(): #i to samo dla każdego dziecka c.printTree(intend+1) #ze zwiększonym wcięciem #Przykład utworzenia drzewa 3-stopnia, potem przeniesienie jednej gałęzi do #drugiego drzewa i znalezienie rodzica a=Node("root") b=Node("child 1") c=Node("child 2.1") d=Node("child 2.2") b.setParent(a) c.setParent(b) d.setParent(b) b.addChild(c) s=Node("root 2") s.addChild(b) #przepisanie drzewa pochodnego od b do korzenia s print("Root of d: "+d.getRoot().name) print("neighboor of c: "+c.getNext().name) print("\nTree:") c.getRoot().printTree() #pobiera korzeń i rysuje całe drzewo #Generowanie drzewa katalogów def generate(dir, root, left=-1): #generuje drzewo dla podanego #argument left to ilość podkatalogów do przeskanowania, -1 - nieskończoność if left==0: return None if os.path.isdir(dir): for f in os.listdir(dir): e=Node(f) if os.path.isfile(f)==False: generate(dir+"/"+f,e, left-1) e.setParent(root) print("Podaj ścieżkę:") dir=input() dirs=Node(dir) generate(dir, dirs) dirs.printTree()