数据结构——python 005 树和二叉树

树和二叉树

树的逻辑关系体现为只有一个双亲结点和多个孩子结点。

定义

树是由n(n≥0)个结点组成的有限集合(记为T)。

如果n = 0,则它是一棵空树,这是树的特例。

如果n > 0,这n个结点中存在(有且仅存在)一个结点作为树的根节点(root),其余结点可分为m(m≥0)个互不相交的有限集T1,T2, ……,Tm,其中每个子集本身又是一棵符合本定义的树,称为根结点的子树。

特征

是一种非线性的数据结构

1、它的每个结点可以有零个或多个后继结点,但有且只有一个前驱结点(根节点除外)

2、这些数据结点按分支关系组织起来,清晰地反映了数据元素之间的层次关系。

数据元素之间是一对多的关系

树的逻辑结构表示法
  • 树形表示法
  • 文氏图表示法
  • 凹入表示法
  • 括号表示法
  • 列表表示法
基本术语
  • 结点的度:某个结点的子树个数
  • 树的度:树中各结点的度的最大值
  • 根结点、叶子结点
  • 路径长度:路径所通过的结点个数减一。
  • 结点的层次:结点的层次从树根开始定义,根结点为第一层
  • 树的深度(高度):树中结点的最大层次。
  • 森林:n个互不相交的树的集合称为森林,把树的根结点删去就成了森林。
性质
  1. 树中的结点数=所有结点度(结点的子树的个数)之和+1
  2. 度为m的树中第i层上最多有mi-1个结点(i≥1)
  3. 当一棵m次树的第i层上有mi-1个结点(i≥1)时,称该层是满的,若一棵m次树的所有叶子结点在同一层并且所有层都是满的,称为满m次树。
  4. 高度为h的m次树最多有(mh-1)/(m-1)个结点
  5. 具有n个结点的m次树的最小高度为logm(n(m-1)+1)向上取整
树的基本运算
遍历结点

1.先根遍历:根结点—>左子树—>右子树

2.后根遍历:左子树—>右子树—>根结点

3.层次遍历:从左到右,从上到下

存储结构
双亲存储结构(顺序存储结构)

[结点值, 双亲结点索引]

通常每个结点有唯一的索引(或伪地址),根结点的索引为0,他没有双亲结点,其双亲结点的索引为-1

优:求某个结点的双亲结点十分容易

缺:求某个结点的孩子结点时需要遍历整个结构

孩子链存储结构

包含数据和指向所有孩子结点的指针

优:查找孩子结点方便

缺:查找双亲结点费时

长子兄弟链存储结构

为每个结点固定设计三个属性:数据元素属性,指向该结点长子的指针,指向该结点下一个兄弟结点的指针。

优:查找孩子结点方便

缺:查找双亲结点费时

列表存储结构

直接采用列表数据类型表示

二叉树

概念

二叉树也称为二分树,是有限的结点集合,这个集合①或为空,②或由一个根节点和两棵互不相交的称为左子树和右子树的二叉树组成。

二叉树和度为2的树(2次树)是不同的:

1.度为2的树中至少有3个结点,二叉树可以为空

2.度为2的树中一个度为的结点不区分左、右子树,二叉树中度为1的结点严格区分左、右子树。

满二叉树

①所有分支节点都有左、右孩子结点 ②叶子结点都集中在二叉树的最下一层

完全二叉树

①最多只有最下面两层的结点的度可以小于2 ②最下面一层的叶子结点都依次排列在该层最左边的位置上

特征
性质
  1. 非空二叉树上的叶子结点数=双分支结点数+1

  2. 非空二叉树上的第i层最多有2i-1个结点(i≥1)

  3. 高度为h的二叉树最多有2h-1个结点(h≥1)

  4. 完全二叉树(结点个数为n)层序编号后的性质。

    (1)若完全二叉树的根结点编号为1,对于编号为i(1≤i≤n)的结点有:

    ​ 1.若i≤n/2向下取整,即2i≤n,则编号为i的结点为分支结点,否则为叶子结点,也就是说,最后一个分支结点的编号为n/2。
    ​ 2.若n为奇数,则n1=0,每个分支结点都是双分支结点;若n为偶数,则n1=1,只有一个单分支结点。

    ​ 3.若编号为i的结点有左孩子结点,则左孩子结点的编号为2i;若编号为i的结点有右孩子结点,则右孩子结点的编号为2i+1。
    ​ 4.若编号为i的结点有左兄弟结点,左兄弟结点的编号为i-1,若有右兄弟结点,右兄弟结点的编号为i+1。
    ​ 5.若编号为i的结点有双亲结点,其双亲结点的编号为i/2向下取整。

    (2)若完全二叉树的根结点编号为0,对于编号为i(0≤i≤n-1)的结点有:

    ​ 1.若i≤n/2(向下取整)-1,则编号为i的结点为分支结点,否则为叶子结点,也就是说,最后一个分支结点的编号为n/2(向下取整)-1。

    ​ 2.若n为奇数,则n1=0,每个分支结点都是双分支结点;若n为偶数,则n1=1,只有一个单分支结点。

    ​ 3.若编号为i的结点有左孩子结点,则左孩子结点的编号为2i+1;若编号为i的结点有右孩子结点,则右孩子结点的编号为2i+2。
    ​ 4.若编号为i的结点有左兄弟结点,左兄弟结点的编号为i-1,若有右兄弟结点,右兄弟结点的编号为i+1。
    ​ 5.若编号为i的结点有双亲结点,其双亲结点的编号为(i-1)/2向下取整。

二叉树的先序、中序和后序遍历

是否先、中、后遍历根结点

先序

根左右

中序

左根右

后序

左右根

哈夫曼树(最优二叉树)

定义

在许多应用中经常给树中的结点赋一个有着某种意义的数值,称此数值为该结点的

从树根结点到某个结点之间的路径长度与该结点上的乘积称为结点的带权路径长度

一棵二叉树中所有叶子结点的带权路径长度之和称为该树的带权路径长度(WPL)

在n0个带权叶子结点构成的所有二叉树中,带权路径长度WPL最小的二叉树称为哈夫曼树。

构造算法(计算)
哈夫曼编码

构造哈夫曼树

结点的左分支为0,右分支为1

二叉树、森林之间的转换

树->二叉树

请添加图片描述
请添加图片描述

二叉树->树

请添加图片描述
请添加图片描述

森林->二叉树

请添加图片描述
请添加图片描述

二叉树->森林

请添加图片描述

请添加图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值