python进阶之数据结构与算法--入门-树(小白piao分享)

树的基本概念:

       生产力专家说,突破源自于‘非线性’地思考问题。本节讨论一种重要的非线性数据结构--树,树结构确实是一种突破,利用它实现的一系列算法要比线性结构执行效率快的多,树也提供了一种更加自然和真实的组织形式。树的结构是分层的,讨论结构要重点区分‘上面的’和‘下面的’。

      树是一种将元素分层次存储的抽象数据类型。除了最顶部的元素,每个元素在树中都有一个‘双亲’节点和零个或者多个的‘孩子’节点,通常称最顶部的元素为树的根(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:
公众号有不定期的公开课

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

        

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读