Python Treelib 多叉樹 數據結構 中文使用幫助文檔




樹,對於計算機編程語言來說是一個重要的數據結構。它具有廣泛的應用,比如文件系統的分層數據結構和機器學習中的一些算法。這里創建了treelib來提供Python中樹數據結構的高效實現。

官方文檔:https://treelib.readthedocs.io/en/latest/

1.安裝
主要通過pip和easy_install進行安裝

windows下:pip install treelib


Linux下:sudo easy_install -U treelib


License許可:

Redistributed under Apache License (2.0) since version 1.3.0.

2.類定義
主要分為Tree和Node兩個類,以支持多叉樹的實現

2.1.Tree類
魔法方法:
構造函數:新建一棵樹或通過深拷貝、淺拷貝方式復制一棵樹

Tree(self, tree=None, deep=False)

len取長度:返回樹的節點個數,同Tree.size()

len(Tree)

str字符串:Tree對象轉換為str對象,可輸出

str(Tree)

unicode字符串:Tree對象轉換為unicode對象,可輸出

unicode(Tree)

方法:

add_node(self, node, parent=None)

向樹添加一個node節點,該節點為Node類對象,其父節點為parent

all_nodes(self)

以list返回所有節點

children(self, nid)

返回以nid為標識(identifier)子節點,nid不存在則返回list為空

contains(self, nid)

檢查樹中是否包含以nid為標識的節點

create_node(self, tag=None, identifier=None, parent=None, data=None)

以parent為父節點,在樹上創建一個節點(類似於創建Node對象,在add_node添加Node)

depth(self, node=None)

返回樹的深度(int),若給定node則返回以該節點為根的樹的深度

expand_tree(self, nid=None, mode=1, filter=None, key=None, reverse=False)

Python生成器,松散地基於 John R. Anderson, Albert T. Corbett, and Brian J. Reiser的一個算法 (’Essential LISP’ , page 239-241)

UPDATE: the @filter function is performed on Node object during traversing.
UPDATE: the @key and @reverse are present to sort nodes at each level.

get_node(self, nid)

返回以nid為標識的節點,nid不存在則返回為空

is_branch(self, nid)

返回以nid為節點的子節點標識(identifier)的list列表,nid不存在則返回list為空

leaves(self, root=None)

返回所有葉節點對象list列表,若給定root則返回以root為根節點的樹的所有葉節點對象list列表

level(self, nid, filter=None)

返回指定深度的所有節點,根節點按深度0計算
Update: @filter params is added to calculate level passing exclusive nodes.

link_past_node(self, nid)

將某節點的父節點與子節點鏈接的方法,將該節點從樹上刪除

比如, 一個a -> b -> c樹 ,刪除b節點, 則剩下a -> c樹

move_node(self, source, destination)

將source的節點移動至destination的子節點

parent(self, nid)

返回以nid為標識的節點的父節點

paste(self, nid, new_tree, deepcopy=False)

粘貼樹,通過連接new_tree的根節點與nid標識的節點,設置deepcopy可進行深拷貝
Update: add @deepcopy of pasted tree.

paths_to_leaves(self)

取得根節點到每一個葉節點的標識路徑,返回值為標識list列表的list列表(二重列表),根節點不省略

比如一棵樹:

Harry
|___ Bill
|___ Jane
| |___ Diane
| |___ George
| |___ Jill
| |___ Mary
| |___ Mark
1

輸出結果:

[['harry', 'jane', 'diane', 'mary'],
['harry', 'jane', 'mark'],
['harry', 'jane', 'diane', 'george', 'jill'],
['harry', 'bill']]

 

remove_node(self, identifier)

移除以nid標識的節點,同時移除其所有的子節點
返回值為移除的節點個數

remove_subtree(self, nid)


移除以nid標識為根節點的一棵子樹
返回值為移除該子樹的樹,nid不存在則返回一個空樹

該方法類似於remove_node(self,nid) 實現效果相同但返回值不同:

remove_node 返回移除的節點個數
remove_subtree 返回移除該子樹的樹

建議使用remove_node來刪除節點,因為remove_subtree將消耗內存以存儲新樹(返回值)

rsearch(self, nid, filter=None)

遍歷從以nid為標識的節點到根節點的路徑(枝)

save2file(self, filename, nid=None, level=0, idhidden=True, filter=None, key=None, reverse=False, line_type=u'ascii-ex', data_property=None)

將樹保存到文件,以作離線分析

show(self, nid=None, level=0, idhidden=True, filter=None, key=None, reverse=False, line_type=u'ascii-ex', data_property=None)

輸出樹結構

siblings(self, nid)

返回以nid為標識的節點的兄弟節點
返回值為兄弟節點list列表,根節點無兄弟節點,返回空列表

size(self, level=None)

返回指定深度(level)節點個數,若無指定則返回整棵樹節點個數

subtree(self, nid)

淺拷貝方式建立一個以nid為標識的節點作為根節點的子樹,nid不存在則返回一個空樹

若使用深拷貝,則請使用構造函數建立新樹,如下:

e.g. 

new_tree = Tree(t.subtree(t.root), deep=True)

 

to_dict(self, nid=None, key=None, sort=True, reverse=False, with_data=False)

將樹轉換為dict字典

to_json(self, with_data=False, sort=True, reverse=False)

將樹轉換為JSON格式輸出

2.2.Node類
魔法方法:
構造函數:新建一個Node節點對象

變量 名稱 說明
tag 標簽 樹輸出時顯示,默認為隨機值
identifier 標識 樹中唯一,不可重復,默認為隨機值
data 數據 存儲節點中數據

Node(self, tag=None, identifier=None, expanded=True, data=None)

方法:

is_leaf(self)

檢查該節點是否是葉節點,返回布爾值

is_root(self)

檢查該節點是否是根節點,返回布爾值

update_bpointer(self, nid)

設置_bpointer指針

update_fpointer(self, nid, mode=0)

設置_fpointer指針

3.實際應用


來源於官方幫助文檔:treelib.readthedocs.io

3.1.基本用法
下面的實例,展示了建立一棵樹的基本方法

 1 >>> from treelib import Node, Tree
 2 >>> tree = Tree()
 3 >>> tree.create_node("Harry", "harry") # root node
 4 >>> tree.create_node("Jane", "jane", parent="harry")
 5 >>> tree.create_node("Bill", "bill", parent="harry")
 6 >>> tree.create_node("Diane", "diane", parent="jane")
 7 >>> tree.create_node("Mary", "mary", parent="diane")
 8 >>> tree.create_node("Mark", "mark", parent="jane")
 9 >>> tree.show()
10 Harry
11 ├── Bill
12 └── Jane
13 ├── Diane
14 │ └── Mary
15 └── Mark

3.2.API 樣例
下面根據上述的數作為例子,展示一部分API用法樣例
* 例1:利用特殊方法擴展一棵樹

1 >>> print(','.join([tree[node].tag for node in \
2 tree.expand_tree(mode=Tree.DEPTH)]))
3 Harry,Bill,Jane,Diane,Mary,Mark

例2:利用自定義過濾擴展一棵樹

1 >>> print(','.join([tree[node].tag for node in \
2 tree.expand_tree(filter = lambda x: \
3 x.identifier != 'diane')]))
4 Harry,Bill,Jane,Mark

例3:獲得以“‘diane”為根節點的子樹

1 >>> sub_t = tree.subtree('diane')
2 >>> sub_t.show()
3 Diane
4 └── Mary

例4:復制以“‘diane”為根節點的子樹

 1 >>> new_tree = Tree()
 2 >>> new_tree.create_node("n1", 1) # root node
 3 >>> new_tree.create_node("n2", 2, parent=1)
 4 >>> new_tree.create_node("n3", 3, parent=1)
 5 >>> tree.paste('bill', new_tree)
 6 >>> tree.show()
 7 Harry
 8 ├── Bill
 9 │ └── n1
10 │ ├── n2
11 │ └── n3
12 └── Jane
13 ├── Diane
14 │ └── Mary
15 └── Mark

例5:從樹上刪除已存在節點

1 >>> tree.remove_node(1)
2 >>> tree.show()
3 Harry
4 ├── Bill
5 └── Jane
6 ├── Diane
7 │ └── Mary
8 └── Mark

例6:將節點移動至另一父節點

1 >>> tree.move_node('mary', 'harry')
2 >>> tree.show()
3 Harry
4 ├── Bill
5 ├── Jane
6 │ ├── Diane
7 │ └── Mark
8 └── Mary

例7:獲得樹深度

>>> tree.depth()
2

例8:獲得節點所在深度

>>> node = tree.get_node("bill")
>>> tree.depth(node)
1

例9:輸出樹結構
以“ascii-em”形式輸出:

>>> tree.show(line_type="ascii-em")
Harry
╠══ Bill
╠══ Jane
║ ╠══ Diane
║ ╚══ Mark
╚══ Mary

以JSON格式輸出:

>>> print(tree.to_json(with_data=True))
{"Harry": {"data": null, "children": [{"Bill": {"data": null}}, {"Jane": {"data": null, "children": [{"Diane": {"data": null}}, {"Mark": {"data": null}}]}}, {"Mary": {"data": null}}]}}


3.3.更多用法
有時,你需要樹來存儲你的數據結構,在最新版本的treelib當中支持了.data屬性,可以存儲任何數據。
比如,定義一個Flower類:

>>> class Flower(object): \
    def __init__(self, color): \
    self.color = color


於是可以建立Flower樹:

>>> ftree = Tree()
>>> ftree.create_node("Root", "root", data=Flower("black"))
>>> ftree.create_node("F1", "f1", parent='root', data=Flower("white"))
>>> ftree.create_node("F2", "f2", parent='root', data=Flower("red"))


按照.data的屬性輸出樹結構:

1 >>> ftree.show(data_property="color")
2 black
3 ├── white
4 └── red

 

注意:在1.2.5版本之前,你需要繼承並重寫Node類方法,比如:

1 >>> class FlowerNode(treelib.Node): \
2     def __init__(self, color): \
3       self.color = color
4 >>> # create a new node
5 >>> fnode = FlowerNode("white")

 


————————————————
版權聲明:本文為CSDN博主「KAlbertLee」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/KAlbertLee/article/details/70158015


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM