问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

各位老师请教一下,

发布网友 发布时间:2022-06-02 17:29

我来回答

1个回答

热心网友 时间:2023-11-24 05:38

  二叉树T是有限个结点的集合,它或者是空集,或者由一个根结点u以及分别称为左子树和右子树的两棵互不相交的二叉树u(1)和u(2)组成。若用n,n1和n2分别表示T,u(1)和u(2)的结点数,则有n=1+n1+n2 。u(1)和u(2)有时分别称为T的第一和第二子树。

  因此,二叉树的根可以有空的左子树或空的右子树,或者左、右子树均为空。

  二叉树有5种基本形态,如图1所示。

  图1 二叉树的5种基本形态(其中□表示空)

  在二叉树中,每个结点至多有两个儿子,并且有左、右之分。因此任一结点的儿子不外4种情况:没有儿子;只有一个左儿子;只有一个右儿子;有一个左儿子并且有一个右儿子。

  --------------------------------------------------------------------------------

  注意:二叉树与树和有序树的区别

  --------------------------------------------------------------------------------

  二叉树与度数不超过2的树不同,与度数不超过2的有序树也不同。在有序树中,虽然一个结点的儿子之间是有左右次序的,但若该结点只有一个儿子时,就无须区分其左右次序。而在二叉树中,即使是一个儿子也有左右之分。例如图2中(a)和(b)是两棵不同的二叉树。虽然它们与图3中的普通树(作为无序树或有序树)很相似,但它们却不能等同于这棵普通的树。若将这3棵树均看作是有序树,则它们就是相同的了。

  图2 两棵不同的二叉树

  图3 一棵普通的树

  由此可见,尽管二叉树与树有许多相似之处,但二叉树不是树的特殊情形。

  二叉树的数学性质
  二叉树具有以下的重要性质:

  高度为h≥0的二叉树至少有h+1个结点;
  高度不超过h(≥0)的二叉树至多有2h+1-1个结点;
  含有n≥1个结点的二叉树的高度至多为n-1;
  含有n≥1个结点的二叉树的高度至少为logn,因此其高度为Ω(logn)。
  具有n个结点的不同形态的二叉树的数目在一些涉及二叉树的平均情况复杂性分析中是很有用的。设Bn是含有n个结点的不同二叉树的数目。由于二叉树是递归地定义的,所以我们很自然地得到关于Bn的下面的递归方程:
  (1)

  即一棵具有n>1个结点的二叉树可以看成是由一个根结点、一棵具有i个结点的左子树和一棵具有n-i-1个结点的右子树所组成。

  (1)式的解是

  (2)

  即所谓的Catalan数。因此,当n=3时,B3=5。于是,含有3个结点的不同的二叉树有5棵,如图4所示。

  图4 含有3个结点的不同二叉树

  特殊形态的二叉树
  满二叉树和近似满二叉树是二叉树的两种特殊情形。

  一棵高度为h≥0且有2h+1-1个结点的二叉树称为满二叉树。

  若一棵二叉树至多只有最下面的两层结点的度数小于2,并且最下面一层结点都集中在该层的最左边,则称这种二叉树为近似满二叉树(有时也称为完全二叉树)。

  (a) 满二叉树

  (b) 近似满二叉树

  (c) 非近似满二叉树

  图5 特殊形态的二叉树

  例如图5(a)是一棵高度为3的满二叉树。满二叉树的特点是每一层上的结点数都达到最大值,即对给定的高度,它是具有最多结点数的二叉树。满二叉树中不存在度数为1的结点,每个分枝结点均有两棵高度相同的子树,且叶结点都在最下面一层上。图5(b)是一棵近似满二叉树。显然满二叉树是近似满二叉树,但近似满二叉树不一定是满二叉树。在满二叉树的最下层上,从最右结点开始连续往左删去若干个结点后得到的二叉树是一棵近似满二叉树。因此,在近似满二叉树中,若某个结点没有左儿子,则它一定没有右儿子,即该结点是一个叶结点。图5(c)中,结点F没有左儿子而有右儿子L,故它不是一棵近似满二叉树。

  二叉树的操作
  二叉树的常用操作与树的常用操作相似。

  运算 含义
  Parent(v,T) 这是一个求父结点的函数,函数值为树T中结点v的父亲。当v是根结点时,函数值为∧,表示结点v没有父结点。
  Left_Child(v,T) 这是一个求左儿子结点的函数。函数值为树T中结点v的左儿子。当结点v没有左儿子时,函数值为∧。
  Right_Child(v,T) 这是一个求右儿子结点的函数。函数值为树T中结点v的右儿子。当结点v没有右儿子时,函数值为∧。
  Create(x,Left,Right,T) 这是一个建树过程。该函数生成一棵新的二叉树T,T的根结点v的标号为x,v的左右儿子分别为Left和Right。
  Label(v,T) 这时一个求标号的函数,函数值就是结点v的标号。
  Root(T) 这是一个求树根的函数,函数值为树T的根结点。当T是空树时,函数值为∧。
  MakeNull(T) 这是一个过程,它使T成为一棵空树。

  二叉树的实现
  我们已经看到,虽然二叉树与树很相似,但它却不是树的特殊情形。在许多情况下,使用二叉树具有结构简单,操作方便的优点。另外我们也看到,在树的左儿子右兄弟表示法中,实际上已将一棵一般的树转化为一棵二叉树。在更一般的情形,我们还可以将果园或森林转化为一棵等价的二叉树。下面我们来讨论几种二叉树的表示方法。

  二叉树的顺序存储结构
  此结构是将二叉树的所有结点,按照一定的次序,存储到一片连续的存储单元中。因此,必须将结点排成一个适当的线性序列,使得结点在这个序列中的相应位置能反映出结点之间的逻辑关系。这种结构特别适用于近似满二叉树。

  在一棵具有n个结点的近似满二叉树中,我们从树根起,自上层到下层,逐层从左到右给所有结点编号,就能得到一个足以反映整个二叉树结构的线性序列,如图6所示。其中每个结点的编号就作为结点的名称。

  图6 近似满二叉树的结点编号

  因此,我们可以对树的类型作如下说明:

  TPosition=integer;

  TreeType=record

  NodeCount:integer; {树的总结点数}

  NodeList:array [1..MaxNodeCount] of LabelType; {存储结点的数组}

  end;

  将数组下标作为结点名称(编号),就可将二叉树中所有结点的标号存储在一维数组中。例如,图6中的二叉树的顺序存储结构如图7所示。

  图7 近似满二叉树的顺序存储结构

  在二叉树的这种表示方式下,各结点之间的逻辑关系是隐含表示的。近似满二叉树中,除最下面一层外,各层都充满了结点。可能除最底层外,每一层的结点个数恰好是上一层结点个数的2倍。因此,从一个结点的编号就可推知其父亲,左、右儿子,和兄弟等结点的编号。例如,对于结点i我们有:

  仅当i=1时,结点i为根结点;

  当i>1时,结点i的父结点为i/2;

  结点i的左儿子结点为2i;

  结点i的右儿子结点为2i+1;

  当i为奇数且不为1时,结点i的左兄弟结点为i-1;

  当i为偶数时,结点i的右兄弟结点为i+1。

  由上述关系可知,近似满二叉树中结点的层次关系足以反映结点之间的逻辑关系。因此,对近似满二叉树而言,顺序存储结构既简单又节省存储空间。

  对于一般的二叉树,采用顺序存储时,为了能用结点在数组中的位置来表示结点之间的逻辑关系,也必须按近似满二叉树的形式来存储树中的结点。显然,这将造成存储空间的浪费。在最坏情况下,一个只有k个结点的右单枝树却需要2k-1个结点的存储空间。例如,只有3个结点的右单枝树,如图8(a)所示,添上一些实际不存在的虚结点后,成为一棵近似满二叉树,相应的顺序存储结构如图8(b)所示。

  图8 一般二叉树的顺序存储结构

  下面我们就用这种顺序存储结构来实现二叉树的常用操作。在这种表示法中,整数0表示空结点∧。对于非近似满二叉树,我们将其补为近似满二叉树,并规定一个特殊的标号&,用来表示补充的结点,&要根据标号的具体类型来确定。

  顺序存储结构实现ADT二叉树的操作

  函数 Parent(v,T);

  功能

  这是一个求父结点的函数,函数值为树T中结点v的父亲。当v是根结点时,函数值为∧,表示结点v没有父结点。

  实现

  Function Parent(v:TPosition;var T:TreeType):TPosition;

  begin

  return(v div 2);

  end;

  说明

  根据这种表示法,我们知道,当i>1时,结点i的父结点为i/2。

  复杂性

  显然为O(1)。

  函数 Left_Child(v,T);

  功能

  这是一个求左儿子结点的函数。函数值为树T中结点v的左儿子。当结点v没有左儿子时,函数值为∧。

  实现

  Function Left_Child(v:TPosition;var T:TreeType):TPosition;

  begin

  if (2*v>T.NodeCount)or(T.NodeList[2*v]=&) then return(0)

  else return(2*v);

  end;

  说明

  如果结点v的左儿子存在,则其下标为2*v。

  复杂性

  显然为O(1)。

  函数 Right_Child(v,T);

  功能

  这是一个求右儿子结点的函数。函数值为树T中结点v的右儿子。当结点v没有右儿子时,函数值为∧。

  实现

  Procere Right_Child(v:TPosition;var T:TreeType):TPosition;

  begin

  if (2*v+1>T.NodeCount)or(T.NodeList[2*v+1]=&) then return(0)

  else return(2*v+1);

  end;

  说明

  如果结点v的左儿子存在,则其下标为2*v+1。

  复杂性

  显然为O(1)。

  函数 Create(x,Left,Right,T);

  功能

  这是一个建树过程。该函数生成一棵新的二叉树T,T的根结点标号为x,左右儿子分别为Left和Right。

  实现

  Procere Create(x:LabelType;var Left,Right,T:TreeType);

  begin

  T.NodeList[1]:=x;

  T.NodeCount:=Left.NodeCount+Right.NodeCount+1;

  h_left:=cal(Left.NodeCount);

  h_right:=cal(Right.NodeCount);{分别计算Left和Right的高度}

  if h_left>h_Right then h:=h_left else h:=h_right;{新树T的高度为h+1}

  for i:=Left.NodeCount+1 to (1 shl (h+1))-1 do Left.NodeList[i]:=&;

  Left.NodeCount:=(1 shl (h+1))-1;

  {将Left补成高度为h的满二叉树;其中shl是左移位运算,用来计算2的幂}

  if h_right<h then

  begin

  for i:=Right.NodeCount+1 to (1 shl h)-1 do Right.NodeList[i]:=&;

  Right.NodeCount:=(1 shl h)-1;

  end;

  {若Right的高度小于h,则将Right补成高度为h-1的满二叉树}

  {=======

  对于Left中编号为i的结点v,它在新树T中的编号为2h +i,其中h=log2(i+1)-1 ;对于Right中编号为i的结点v,它在新树T中的编号为2h+1+i,其中h=log2(i+1)-1 。

  =======}

  for i:=1 to Left.NodeCount do

  T.NodeList[(1 shl cal(i))+i]:=Left.NodeList[i];

  {计算出Left中编号为i的结点在T中的位置,将其复制到T中}

  for i:=1 to Right.NodeCount do

  T.NodeList[(1 shl (cal(i)+1))+i]:=Right.NodeList[i];

  {计算出Right中编号为i的结点在T中的位置,将其复制到T中}

  end;

  其中cal(i)用来计算含有i个结点的近似满二叉树T的高度,cal(i)=log2(i+1)-1,可以实现如下:

  Function cal(i:integer;):integer;

  var

  x:real;

  begin

  x:=log2(i+1)-1;

  if x=int(x) then return(x) else return(int(x)+1); {向上取整}

  end;

  其中log2(n)计算实数n以2为底的对数。

  说明

  在顺序存储的结构下,建立一棵新的二叉树的过程比较复杂。我们首先给出以下几个命题:

  命题一

  一棵高度为h的满二叉树有2h+1-1个结点。

  证明:

  满二叉树的第i层有2i个结点,i=0,1,2,...,h(树根为第0层),因此高度为h的满二叉树有20+21+..+2h = 2h+1-1个结点。

  推论一

  我们从树根起,自上层到下层,逐层从左到右给二叉树的所有结点编号,如图6所示,则近似满二叉树的第h层的从左到右第k个结点的编号为2h+k-1。

  证明:

  由于是近似满二叉树,所以第0层到第h-1层是满二叉树,根据命题一知道共有2h-1个结点,因此第h层的从左到右第1个结点的编号为2h-1+1,第h层的从左到右第k个结点的编号为2h-1+k。

  推论二

  一棵有n个结点的近似满二叉树,高度为log2(n+1)-1 ,其中 是天花板符号, x表示大于等于x的最小整数。

  证明:

  有n个结点的近似满二叉树,若其高度为h,则满足2h-1<n≤2h+1-1,化简得 log2(n+1)-1 ≤ h < [log2(n+1)-1]+1,即h=log2(n+1)-1。

  推论三

  在近似满二叉树T中,设编号为i的结点处于T的第h层从左到右第k个位置上,则h=log2(i+1)-1 ,k=i-(2h-1)。

  证明:

  我们先不考虑编号大于i的结点,则前i个结点构成一棵近似满二叉树,根据推论二知其层数为h=log2(i+1)-1 ,又因为第0层到第h-1层是满二叉树,根据命题一知道共有2h-1个结点,所以编号为i的结点处于第h层的第k=i-(2h-1)个位置上。

  我们用T(h,k)表示树T的第h层的第k个结点,则有下列命题:

  命题二

  Left(h,k)=T(h+1,k),Right(h,k)=T(h+1,k+2h),其中Left和Right分别是树T的根结点的左右子树。

  证明:

  显然。

  我们用N(v,T)表示结点v在生成的新树T中的编号,则有下列命题:

  命题三

  对于Left中编号为i的结点v,N(v,T)=2h +i,其中h=log2(i+1)-1 ;对于Right中编号为i的结点v,N(v,T)=2h+1+i,其中h=log2(i+1)-1 。

  证明:
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
康复者的血清中含有什么免疫分子 血清里面有什么 走读的定义在哪些教育阶段适用? PostgreSQL修改数据库表的列属性操作 Ubuntu调整postgresql默认路径 ubuntu – Postgresql:更改默认数据路径 刘邦几个老婆刘邦老婆吕雉和戚夫人的不同结局 刘邦几个老婆?. 如何防止父母在微信群里抢红包? 有哪些适合夏天选择的长裙款式值得推荐? 映日——别样红 二叉树都有哪些性质 我今年要考全国二级,想问各位二叉树的性质有哪些? 手机NOKIA N95现在多少钱啊? 诺基亚手机n95好还是n97好一些??? 求证明关于二叉树性质6 nokia N95手机怎么样? 关于诺基亚N95手机! 诺基亚手机n95到底支不支持JAVA 接天莲叶无穷碧 映日什么别样红 气味 是什么物质?可以弄一个筛子 把它过滤掉吗? 集团分析模型的理论代表人物是谁 求一款类似于Nokia N95的手机 气味是物质吗 NOKIA N95的手机问题 NOKIA手机N95哪不好 初始模型集合及其修改 怎么通过支付宝查到对方的手机号 苹果13边框能插a4纸能退货吗 “侍”是有何意思? 二叉树性质5的问题 二叉树性质五中,若结点编号为11的话,就不满足第一点,它的双亲编号应该是int(11&#47;2)=5,怎 X240休眠后无法关机开机? 人们闻到物体的气味是这个物体的本身还是气味分子? 气味是什么..是实体吗??? 华为mate40怎么屏幕和摄像头歪的 谁知道长城和颐和园的英语简介和英语感想 分别每个两三句就行 很急的 回答被采纳会提高鉴赏分 x240未经授权网卡 什么是描述数据仓库内数据的结构和建立方法的数据 联想Thinkpad x240s 关机后出现如图这种情况,开不开机,请问应该怎么解决?急! 联想X240突然闪屏,强制关机后无法再开机 请高手帮忙翻译一段难懂的英文 笔记本电脑thinkpad x240用到没电自动关机后拿去充电,充了一晚上开机就开不了机了,怎么办 什么物质有气味 有的物质的气味是什么?有些气味又是哪些物质的气味? 物质的味道由什么决定? 求把这两段话翻译成英文: 1.如果我拥有拯救世界的力量,我想我做的第一件事就是将它毁灭 2..... 生活中哪些物质具有气味??? 如何从企业招聘方面入手解决招工难 公司的招聘简介怎样写才能对应聘者有吸引力?