algorytm.org

Implementacja w Python



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Drzewo - Implementacja w Python
Ocena użytkownikóww: *****  / 5
SłabyŚwietny
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()
Dodaj komentarz