数据结构—树与二叉树(PartⅠ)—树的基本概念&二叉树的概念和性质

目录


数据结构-树与二叉树(第七章)的整理笔记,若有错误,欢迎指正。

树的定义

  • 树是n(n≥0)个结点的有限集。当n=0时,称为空树,这是树的特例。

  • 在任意一棵非空树中应满足:
    (1)树有且仅有一个特定的称为根的结点。
    (2)当n>1时,其余结点可分为m(m≥0)个互不相交的有限集 T 1 , T 2 , . . . , T m T_1,T_2,...,T_m T1,T2,...,Tm,其中每个集合本身又是一棵树,并且称为根的子树。
    在这里插入图片描述

  • 显然,树是一种递归的数据结构,即在树的定义中又用到了其自身。树作为一种逻辑结构,同时也是一种分层结构,具有以下两个特点:
    (1)树的根结点没有前驱,除根结点外的所有结点有且只有一个前驱
    在这里插入图片描述
    (2)树中所有结点可以有零个或多个后继。

  • 树适合于表示具有层次结构的数据。树中的某个结点(除根结点外)最多只和上一层的一个结点(即其父结点)有直接关系,根结点没有直接上层结点,因此在n个结点的树中有n-1条边。而树中每个结点与其下一层的零个或多个结点有直接关系。

树的逻辑表示方法

树形表示法(tree representation)

  • 用ー个圆圈表示一个结点,圆圈内的符号代表该结点的数据信息,结点之间的关系通过连线表示。虽然每条连线上都不带有箭头(即方向),但它仍然是有方向的,其方向隐含着从上向下,即连线的上方结点是下方结点的前驱结点,下方结点是上方结点的后继结点。它的直观形象是一棵倒置的树(树根在上,树叶在下)。

文氏图表示法(venn diagram representation)

  • 每棵树对应一个圆圈,圆圈内包含根结点和子树的圆圈,同一个根结点下的各子树对应的圆圈是不能相交的。在用这种方法表示的树中,结点之间的关系是通过圆圈的包含来表示的。

凹入表示法(concave representation)

  • 每棵树的根结点对应一个条形,其子树的根对应着一个较短的条形,且树根在上,子树的根在下,同一个根下的各子树的根对应的条形长度是一样的。

括号表示法(bracket representation)

  • 每棵树对应一个形如“根(子树1,子树2,子树m)”的字符串,每棵子树的表示方式与整棵树类似,各子树之间用逗号分开。在用这种方法表示的树中,结点之间的关系是通过括号的嵌套表示的。

在这里插入图片描述

树的基本术语

在这里插入图片描述

结点的度与树的度

  • 树中一个结点的孩子个数称为该结点的度,树中结点的最大度数称为树的度
  • 例: 结点A的度为3,结点B的度为2,结点C的度为1,结点E的度为2,结点F的度为0;树的度为3(树中结点的最大度数为3)。
  • 通常将度为m的树称为m次树(m-tree)。

分支结点与叶子结点

  • 度大于0的结点称为分支结点(又称非终端结点);度为0(没有子女结点)的结点称为叶子结点(又称终端结点)。
  • 例: 结点B、C、D、E、H为分支节点;结点F、G、I、J、K、L、M为叶子结点。
  • 在分支结点中,每个结点的分支数就是该结点的度。

路径与路径长度

  • 树中两个结点之间的路径是由这两个结点之间所经过的结点序列构成的,而路径长度是路径上所经过的边的个数。
  • 例: 从A到K的路径为(A,B,E,K),经过三条边( A → B → E → K A\rightarrow B\rightarrow E\rightarrow K ABEK),因此路径长度为3。
  • 由于树中的分支是有向的(隐含从上到下),即从双亲指向孩子,所以树中的路径是从上向下的,同一双亲的两个孩子之间不存在路径。
  • 例: 结点H、I、J为结点D的孩子结点,结点D为结点H、I、J的双亲结点。因此结点H、I、J中任何两个结点之间不存在路径。

祖先结点、子孙结点、孩子结点、双亲结点和兄弟结点

  • 在一棵树中,每个结点的后继结点被称为该结点的孩子结点(children)。相应地,该结点被称为孩子结点的双亲结点(parents)。具有同双亲结点的孩子结点互为兄弟结点(sibling)。双亲在同一层的结点互为堂兄弟结点。每个结点对应子树中的所有结点(除自身外)称为该结点的子孙结点(descendant),把从根结点到达某个结点的路径上经过的所有结点(除自身外)称为该结点的祖先结点(ancestor)。
  • 例: 结点A、B、E为结点K的祖先结点;结点D的子孙结点有结点H、I、J、M;结点G是结点C的孩子结点;结点C是结点G的双亲结点;结点B、C、D互为兄弟结点;结点G与结点E、F、H、I、J互为堂兄弟结点。

结点层次、结点高度和树的高度

  • 结点层次(level)或结点深度(depth)是从根结点开始自顶向下逐层累加的。结点高度是从叶结点开始自底向上逐层累加的。树的高度(height of tree)或树的深度(depth of tree)是树中结点的最大层数。
    • 例: 结点A(根节点)的深度是1,高度是4;结点B、C、D的深度是2,高度是3;结点E、F、G、H、I、J的深度是3,高度是2;结点K、L、M的深度是4,高度是1;树的高度为4。

有序树和无序树

  • 树中结点的各子树从左到右是有次序的,不能互换,称该树为有序树,否则称为无序树。

森林

  • 森林是m(m>0)棵互不相交的树的集合。森林的概念与树的概念十分相近,因为只要把树的根结点删去就成了森林。反之,只要给m(m>1)棵独立的树加上一个结点,并把这m棵树作为该结点的子树,则森林就变成了树。
    在这里插入图片描述

树的性质

性质1:树中的结点数等于所有结点的度数之和加1。

  • 例: 已知一棵度为4的树中,度为0,1,2,3,4的结点数分别为14,4,3,2,2。
  • 则树的结点总数=14×0+4×1+3×2+2×3+2×4+1=25。

性质2:度为m的树中第i层上至多有 m i − 1 m^{i-1} mi1个结点(i≥1)。

  • 例: 度为4的树,第一层(i=1)至多有1个结点( m i − 1 = 4 1 − 1 = 1 m^{i-1}=4^{1-1}=1 mi1=411=1);第二层(i=2)至多有4个结点( m i − 1 = 4 2 − 1 = 4 m^{i-1}=4^{2-1}=4 mi1=421=4);第三层(i=3)至多有16个结点( m i − 1 = 4 3 − 1 = 16 m^{i-1}=4^{3-1}=16 mi1=431=16)…

性质3:高度为h的m次树(度为m)至多有 m h − 1 m − 1 \frac{m^h-1}{m-1} m1mh1个结点。

  • 证明:由树的性质2可知,第i层上最多的结点树为 m i − 1 m^{i-1} mi1(i=1~h),显然当高度为h的m次树为满m次树时结点个数最多,因此有以下关系。
  • 最多结点数=每一层最多结点数之和= m 0 + m 1 + . . . + m h − 1 = m h − 1 m − 1 m^0+m^1+...+m^{h-1}=\frac{m^h-1}{m-1} m0+m1+...+mh1=m1mh1
  • 满m次树的另一种定义为当一棵高度为h的m次树上的结点数等于 m h − 1 m − 1 \frac{m^h-1}{m-1} m1mh1时称该树为满m次树。
    在这里插入图片描述
  • 例: 对于一棵高度为5的满2次树,结点数为 2 5 − 1 2 − 1 = 31 \frac{2^5-1}{2-1}=31 21251=31;对于一棵高度为5的满3次树,结点数为 3 5 − 1 3 − 1 = 121 \frac{3^5-1}{3-1}=121 31351=121

性质4:具有n个结点的m次树的最小高度 ⌈ l o g m n ( m − 1 ) + 1 ⌉ ⌈log_m^{n(m-1)+1}⌉ logmn(m1)+1(⌈ ⌉为向上取整)

  • 证明:设具有n个结点的m次树的高度为h,若在该树中前h-1层都是满的,即每层的结点数都等于 m i − 1 m^{i-1} mi1个(1≤i≤h-1),第h层(即最后一层)的结点数可能满,也可能不满,但至少有一个结点,则该树具有最小的高度。
  • 根据树的性质3可得: m h − 1 − 1 m − 1 + 1 ≤ n ≤ m h − 1 m − 1 \frac{m^{h-1}-1}{m-1}+1≤n≤\frac{m^h-1}{m-1} m1mh11+1nm1mh1。前者结点个数对应的树是1~h-1时都是满的,第h层只有一个结点;后者结点个数对应的树是1~h时都是满的。
  • 为了便于计算,将其等价地改为: m h − 1 − 1 m − 1 < n ≤ m h − 1 m − 1 \frac{m^{h-1}-1}{m-1}<n≤\frac{m^h-1}{m-1} m1mh11nm1mh1
  • 均乘(m-1)后加1: m h − 1 < n ( m − 1 ) + 1 ≤ m h m^{h-1}<n(m-1)+1≤m^h mh1<n(m1)+1mh
  • 取以m为底的对数: h − 1 < l o g n n ( m − 1 ) + 1 ≤ h h-1<log_n^{n(m-1)+1}≤h h1<lognn(m1)+1h
  • 即有: l o g n n ( m − 1 ) + 1 ≤ h < l o g n n ( m − 1 ) + 1 + 1 log_n^{n(m-1)+1}≤h<log_n^{n(m-1)+1}+1 lognn(m1)+1hlognn(m1)+1+1
  • 因h只能取整数,所以有: h = ⌈ l o g m n ( m − 1 ) + 1 ⌉ h=⌈log_m^{n(m-1)+1}⌉ h=logmn(m1)+1
  • 例: 具有20个结点的2次树的最小高度为 ⌈ l o g 2 20 ( 2 − 1 ) + 1 ⌉ = 5 ⌈log_2^{20(2-1)+1}⌉=5 log220(21)+1=5(向上取整);具有20个结点的3次树的最小高度为 ⌈ l o g 3 30 ( 2 − 1 ) + 1 ⌉ = 4 ⌈log_3^{30(2-1)+1}⌉=4 log330(21)+1=4(向上取整)。

具有n个结点的m次树的最大高度为n-m+1。

  • 对于m次数,其中至少有一个结点的度为m,这样的树具有最大高度:除了某一层含有m个结点以外,其余各层都只有一个结点,显然高度为n-m+1。
  • 例: 具有n个结点的4次树的最大高度为n-3。
    在这里插入图片描述
  • 在m次树中计算结点个数时常用的关系式有:
    ①所有结点度树之和= n − 1 n-1 n1
    ②所有结点度数之和= 0 × n 0 + 1 × n 1 + 2 × n 2 + … + m × n m 0×n_0+1×n_1+2×n_2+…+m×n_m 0×n0+1×n1+2×n2++m×nm
    n = n 0 + n 1 + … + n m n=n_0+n_1+…+n_m n=n0+n1++nm
    (其中 n 0 、 n 1 、 . . 、 n m n_0、n_1、..、n_m n0n1..nm分别代表度为0的结点个数、度为1的结点个数、…、度为m的结点个数)
  • 例: 若一棵3次树中度为3的结点有两个,度为2的结点有一个,度为1的结点有两个,则该3次树中总的结点个数和叶子结点个数分别是多少?
  • 设度为0的结点有x个(即叶子节点)
  • 所有结点度树之和 = n − 1 = n 0 + n 1 + n 3 = ( x + 2 + 1 + 2 ) − 1 = 4 + x =n-1=n_0+n_1+n_3=(x+2+1+2)-1=4+x =n1=n0+n1+n3=(x+2+1+2)1=4+x
  • 所有结点度数之和= 0 × x + 1 × 2 + 2 × 1 + 3 × 2 = 10 0×x+1×2+2×1+3×2=10 0×x+1×2+2×1+3×2=10
  • 总的结点个数n=所有结点度树之和+1=10+1=11
  • 4 + x = 10 → x = 6 4+x=10\rightarrow x=6 4+x=10x=6,即叶子结点个数为6。


二叉树的定义

  • 二叉树(binary tree)是一个有限的结点集合,这个集合或者为空,或者由一个根节点和两棵互不相交的称为左子树(left subtree)和右子树(right subtree)的二叉树组成。
    在这里插入图片描述

  • 二叉树是另一种树形结构,其特点是每个结点至多只有两棵子树(即二叉树中不存在度大于2的结点),并且二叉树的子树有左右之分,因此它是有序树,若将其左、右子树颠倒,则成为另一棵不同的二叉树。即使树中结点只有一棵子树,也要区分它是左子树还是右子树。

度为m的树(m次树)m叉树
任意结点的度≤m(最多m个孩子)任意结点的度≤m(最多m个孩子)
至少有一个结点度=m(有m个孩子)允许所有结点的度都<m
一定是非空树,至少有m+1个结点可以是空树
不区分左、右子树严格区分左、右子树
  • 二叉树的结构简单、存储效率高,其运算算法也相对简单,而且任何m次树都可以转化为二叉树的结构。

  • 二叉树有5种基本形态,任何复杂的二叉树都可以看成是这5种基本形态的复合。
    在这里插入图片描述

  • 二叉树的表示法也和树的表示法一样,有树形表示法、文氏图表示法、凹入表示法和括号表示法等。

几种特殊的二叉树

满二叉树

  • 一棵高度为h且含有 2 h − 1 2^h-1 2h1个结点的二叉树称为满二叉树,即树中的每层都含有最多的结点。满二叉树的叶子结点都集中在二叉树的最下一层,并且除叶子结点之外的每个结点度数均为2。
  • 可以对满二叉树按层序编号:约定编号从根结点(根结点编号为1)起,自上而下,自左向右。这样,每个结点对应一个编号,对于编号为i的结点,若有双亲,则其双亲为 ⌊ i 2 ⌋ ⌊\frac{i}{2}⌋ 2i(向下取整),若有左孩子,则左孩子为2i;若有右孩子,则右孩子为2i+1。
    在这里插入图片描述

完全二叉树

  • 高度为h、有n个结点的二叉树,当且仅当其每个结点都与高度为h的满二叉树中编号为1~n的结点对应时,称为完全二叉树。
  • 其特点如下:
    ①若 i ≤ ⌊ i 2 ⌋ i≤⌊\frac{i}{2}⌋ i2i,则结点i为分支结点,否则为叶子结点。
    ②叶子结点只可能在层次最大的两层上出现(倒数第一层和倒数第二层)。对于最大层次中的叶子结点,都依次排列在该层最左边的位置上。
    ③若有度为1的结点,则只可能有一个,且该结点只有左孩子而无右孩子。
    在这里插入图片描述

④按层序编号后,一旦出现某结点(编号为i)为叶子结点或只有左孩子,则编号大于i的结点均为叶子结点。
⑤若n为奇数,则每个分支结点都有左孩子和右孩子;若n为偶数,则编号最大的分支结点(编号为 n 2 \frac{n}{2} 2n)只有左孩子,没有右孩子,其余分支结点左、右孩子都有。
在这里插入图片描述

二叉排序树

  • 左子树上所有结点的关键字均小于根结点的关键字;右子树上的所有结点的关键字均大于根结点的关键字;左子树和右子树又各是一棵二叉排序树。
    在这里插入图片描述

平衡二叉树

  • 树上任一结点的左子树和右子树的深度之差不超过1。
    在这里插入图片描述

二叉树的性质

性质1:非空二叉树上的叶子结点数等于度为2的结点数加1,即 n 0 = n 2 + 1 n_0=n_2+1 n0=n2+1

性质2:非空二叉树上第k层上至多有 2 k − 1 2^{k-1} 2k1个结点(k≥1)。

性质3:高度为h的二叉树至多有 2 h − 1 2^h-1 2h1个结点(h≥1);至少有 2 h − 1 + 1 2^{h-1}+1 2h1+1个结点(h≥1)。

性质4:对完全二叉树,按从上到下、从左到右的顺序依次编号1,2,…,n,则有以下关系:

①当i>1时,结点i的双亲的编号为 ⌊ i 2 ⌋ ⌊\frac{i}{2}⌋ 2i,即当i为偶数时,其双亲的编号为 i 2 \frac{i}{2} 2i,它是双亲的左孩子;当i为奇数时,其双亲的编号为 i − 1 2 \frac{i-1}{2} 2i1,它是双亲的右孩子
②当2i≤n时,结点i的左孩子编号为2i,否则无左孩子。
③当2i+1≤n时,结点i的右孩子编号为2i+1,否则无右孩子。
④结点i所在层次(深度)为 ⌊ l o g 2 n ⌋ + 1 ⌊log_2^n⌋+1 log2n+1

性质5:有n个(n>0)结点的完全二叉树的高度为 ⌈ l o g 2 n + 1 ⌉ ⌈log_2^{n+1}⌉ log2n+1 ⌊ l o g 2 n ⌋ + 1 ⌊log_2^n⌋+1 log2n+1

  • 证明:设高度为h,根据性质3和完全二叉树的定义有
    2 h − 1 − 1 < n ≤ 2 h − 1 2^{h-1}-1<n≤2^h-1 2h11<n2h1 2 h − 1 ≤ n < 2 h 2^{h-1}≤n<2^h 2h1n<2h

  • 对于一棵完全二叉树,结点总数n可以确定其形态, n 1 n_1 n1(度为1的结点)只能是0或1。

  • 当n为偶数时, n 1 n_1 n1=1;当n为奇数时, n 1 n_1 n1=0;

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值