树的基本概念:
生产力专家说,突破源自于‘非线性’地思考问题。本节讨论一种重要的非线性数据结构--树,树结构确实是一种突破,利用它实现的一系列算法要比线性结构执行效率快的多,树也提供了一种更加自然和真实的组织形式。树的结构是分层的,讨论结构要重点区分‘上面的’和‘下面的’。
树是一种将元素分层次存储的抽象数据类型。除了最顶部的元素,每个元素在树中都有一个‘双亲’节点和零个或者多个的‘孩子’节点,通常称最顶部的元素为树的根(root),其他元素被连接在它的下面,这和真正的植物树的结构刚好相反。
正式的树定义:
通常我们将树T定义为存储一系列元素的有限节点集合,这些节点具有parent-children关系并且满足如下属性:
1、如果树T不为空,则它一定有一个根节点r,且该节点没有父节点
2、每个非根节点v都具有唯一的父节点w,每个具有父节点w的节点都是节点w的子节点
3、同一个父节点的子节点互为兄弟节点,一个没有子节点的节点,称之为外部节点或者叶子节点
4、有一个或者多个孩子节点的节点v称之为内部节点。
5、如果树中的每个节点的孩子节点都有特定的顺序,那么这个树被称为有序树
树的抽象数据类型:
用位置作为节点的抽象数据结构来定义树的抽象数据结构,一个元素存储在一个位置,并且位置信息满足树中的父节点和子节点的关系。一棵树的位置对象支持如下方法:
p.element():返回存储在位置p的元素
T.root():返回树T的根节点的位置。如果树为空,则返回None。
T.is_root(p):如果位置p是树T的根,则返回True
T.parent(p):返回位置为p的父节点的位置。如果p的位置为树的根节点,则返回None
T.num_children(p):返回位置为p的孩子节点的编号
T.children(p):产生位置为p的孩子节点的一个迭代
T.is_leaf(p):如果未知节点p没有任何孩子,则返回True
len(T):返回树T所包含的元素的数量
T.is_empty():如果树T不包含任何位置
T.positions():迭代生成存储在树T中的所有位置
iter(T):迭代产生存储在树T中的所有元素
以上所有方法均接受一个位置作为参数,但是如果树T中的这个位置是无效的,则调用它就会触发一个ValueError
树的代码:
抽象基类的一些具体方法:
计算深度和高度:
深度:
假设p是树中的一个节点,则该节点的深度为节点p的祖先的个数,不包括p本身。
如果p是根节点,则p的深度为0
否则,p的深度就是其父节点的深度加1
依照此,给出计算深度的递归算法:
高度:
如果p是叶子节点,那么它的高度为0,如果不是,则其高度为孩子节点中最大高度+1;一颗非空树T的高度是树根节点的高度。计算非空树的代码如下:(遍历找到所有叶子节点中的最大深度)
更加高效的方式:
想要了解更多有趣内容,请关注‘小白piao学python’(会有不定期的公开课哦),如果想要咨询学习python的小技巧,可以联系小白piao的个人微信:wxi_xbp_python3: