1. 程式人生 > >Python基礎:python實現樹結構

Python基礎:python實現樹結構

樹是我們常見的一種一對多的資料結構。

最近為了處理一些事情,寫了一顆三層的樹。每層的子節點數目均不確定,動態新增。
為了方便管理,寫成了巢狀樹。

class ModelTree():
    #第一層樹,建立樹是必須指定根結點,不支援建立空樹。
    #整顆樹儲存在tree_dict中,key為root,value為children_dict
    #children_dict中儲存所有的子節點,個數不確定,動態新增
    def __init__(self, root):
        self.tree_dict = {}
        self.children_dict = {}
        self.root = root
        self.tree_dict[self.root] = self.children_dict

    #獲取根結點的方法
def get_root(self): return self.root #新增子節點 def add_child(self, *args): #子節點中儲存兩個值,屬性名稱attr和對應的屬性子樹物件attrObj attr = args[0] value = args[1] #如果已經有某顆屬性子樹,則獲取attrObj物件,新增新的value值 if attr in self.children_dict.keys(): attrObj = self.children_dict[attr] attrObj.add_value_child(value) #否則建立一顆新的子樹
else: attrObj = AttributeChildTree(attr) attrObj.add_value_child(value) self.children_dict[attr] = (attrObj) #獲取某顆特定子樹的物件 def get_single_child(self, attr): return self.children_dict[attr] #獲取所有子樹/子節點 def get_all_children(self): return
self.children_dict #獲取整顆樹 def get_tree(self): return self.tree_dict #第二層,屬性子樹 class AttributeChildTree(): #初始化方法,建立樹時必須指定根結點,不允許建立空樹,根結點的值為屬性名稱 #children_dict儲存所有的子節點,子節點包括兩個值,一個是該屬性的某個值,一個是該值出現的次數 #屬性子樹中的sum值,統計該子樹一共獲取了多少個值,方便之後根據該值計算每個值出現的頻率 def __init__(self, root): # root is attr, children are value-frequency pairs self.root = root self.value_dict = {} self.children_dict = {} self.sum = 0 #該方法在整顆樹都建立完成之後,所有子節點都新增完畢之後呼叫。 #當然沒有新增完畢,也可以達到同樣的效果。將把子節點中儲存的count值替換為frequency def __refresh__(self): # call this function after all the attributes added, will refresh apperance to frequency for value, apperance in self.children_dict.items(): frequency = round(apperance/self.sum,4) self.children_dict[value] = frequency #增加子節點,如果已經存在某個value,count+1,否則建立新的value子樹。每增加一個value,sum+1 def add_value_child(self, value): if value in self.children_dict.keys(): self.sum += 1 self.children_dict[value] += 1 # apperance +1 else: self.sum += 1 self.children_dict[value] = 1 #獲取根結點 def get_root(self): return self.root #獲取全部子節點 def get_children(self): return self.children_dict