c语言多叉树二重指针的用法,Python Treelib 多叉树 数据结构 中文使用帮助文档

Python Treelib 多叉树 数据结构 中文使用帮助文档

树,对于计算机编程语言来说是一个重要的数据结构。它具有广泛的应用,比如文件系统的分层数据结构和机器学习中的一些算法。这里创建了treelib来提供Python中树数据结构的高效实现。

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

输出结果:

[['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.实际应用

3.1.基本用法

下面的实例,展示了建立一棵树的基本方法

>>>from treelib import Node, Tree

>>>tree = Tree()

>>>tree.create_node("Harry", "harry") # root node

>>>tree.create_node("Jane", "jane", parent="harry")

>>>tree.create_node("Bill", "bill", parent="harry")

>>>tree.create_node("Diane", "diane", parent="jane")

>>>tree.create_node("Mary", "mary", parent="diane")

>>>tree.create_node("Mark", "mark", parent="jane")

>>>tree.show()

Harry

├── Bill

└── Jane

├── Diane

│ └── Mary

└── Mark

3.2.API 样例

下面根据上述的数作为例子,展示一部分API用法样例

* 例1:利用特殊方法扩展一棵树

>>>print(','.join([tree[node].tag for node in \

tree.expand_tree(mode=Tree.DEPTH)]))

Harry,Bill,Jane,Diane,Mary,Mark

例2:利用自定义过滤扩展一棵树

>>>print(','.join([tree[node].tag for node in \

tree.expand_tree(filter = lambda x: \

x.identifier != 'diane')]))

Harry,Bill,Jane,Mark

例3:获得以“‘diane”为根节点的子树

>>>sub_t = tree.subtree('diane')

>>>sub_t.show()

Diane

└── Mary

例4:复制以“‘diane”为根节点的子树

>>>new_tree = Tree()

>>>new_tree.create_node("n1", 1) # root node

>>>new_tree.create_node("n2", 2, parent=1)

>>>new_tree.create_node("n3", 3, parent=1)

>>>tree.paste('bill', new_tree)

>>>tree.show()

Harry

├── Bill

│ └── n1

│ ├── n2

│ └── n3

└── Jane

├── Diane

│ └── Mary

└── Mark

例5:从树上删除已存在节点

>>>tree.remove_node(1)

>>>tree.show()

Harry

├── Bill

└── Jane

├── Diane

│ └── Mary

└── Mark

例6:将节点移动至另一父节点

>>>tree.move_node('mary', 'harry')

>>>tree.show()

Harry

├── Bill

├── Jane

│ ├── Diane

│ └── Mark

└── 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的属性输出树结构:

>>>ftree.show(data_property="color")

black

├── white

└── red

注意:在1.2.5版本之前,你需要继承并重写Node类方法,比如:

>>>class FlowerNode(treelib.Node): \

def __init__(self, color): \

self.color = color

>>># create a new node

>>>fnode = FlowerNode("white")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值