python进阶之数据结构与算法--入门-树

树的基本概念:

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

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

        

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白piao

创作不易,支持一下!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值