什么是二叉树等价

作者&投稿:晏林 (若有异议请与网页底部的电邮联系)
创建一棵如下图所示的两棵二叉树,并判断两颗二叉树是否等价的算法。~

看不到图,简单写了下判断二叉树等价的方法,不知道是不是楼主需要的...

public static boolean MyFunction(node root1, node root2)
{
if (root1==null && root2==null)
return true;
else if (root1==null || root2==null)
return false;
else if (root1 != root2)
return false;
else if (root1==root2)
return (MyFunction(root1.left,root2.left)&&MyFunction(root1.right,root2.right));

}

二叉树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没有右儿子时,函数值为∧。

实现

Procedure 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。

实现

Procedure 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);

if h_left>h_Right then h:=h_left else h:=h_right;

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

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

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;

{=======

对于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];

for i:=1 to Right.NodeCount do

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

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 。

证明:


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

期权价值评估二叉树是指什么
二叉树期权定价模型是一种金融期权价值的评估方法,包括单期二叉树定价模型、两期二叉树模型、多期二叉树模型.1.单期二叉树定价模型 期权价格=(1+r-d)\/(u-d)×c\/(1+r)+(u-1-r)\/(u-d)×c\/(1+r)u:上行乘数=1+上升百分比 d:下行乘数=1-下降百分比 【理解】风险中性原理的应用 其中:上...

期权价值评估二叉树是指什么
在期权定价中,二叉树模型(Binomial Tree Model)是一种常用的离散模型,用于估计期权的价值。它是一种基于离散时间步长的模型,将期权到期时间段分割为若干个小时间步。在每个时间步内,考虑标的资产价格的两种可能性:上涨和下跌。因此,二叉树模型的名称来自于每个时间步可以形成两个可能的分支。二叉树...

处理树形结构,为什么经常转换成二叉树
1、因为树的遍历序列和二叉树等价,因此可以统一到用二叉树处理 2、用二叉链表存储可以节约很多存储空间

介绍下二叉树
完全二叉树就是指只有最下面的两层结点度小于2,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树 满二叉树就是指除了叶结点外每一个结点都有左右子叶,且叶结点都处在最底层的二叉树 二叉树的应用:包括二叉树的建立、遍历、叶结点数、高度、左右子结点互换、等价性判断、复制、二叉搜索树...

从概念上讲,树、森林和二叉树是三种不同的数据结构,将树、森林转化为...
与二叉树等价的森林 平衡二叉树 森林是什么 二叉树表示森林 正规二叉树 什么是二叉树 其他类似问题2008-05-18 1、从概念上讲,树、森林和二叉树是三种不同的数据结构,将树、... 2 2011-05-18 从概念上讲,树,森林和二叉树是三种不同的数据结构 4 2008-05-18 将树、森林转化为二叉树的基本目的...

二叉树02.深度优先遍历之Morris遍历
如果了解线索二叉树的话,肯定对前驱和后继非常熟悉。 通过在二叉树节点增加前驱和后继指针,可以非常方便地进行向前查找、向后查找和遍历等线性化操作,相当于是二叉树和链表的结合。这其中指向前驱和后继的指针称之为线索,而包含线索的二叉树则称之为线索二叉树(Threaded Binary Tree)[3]。 譬如 ...

普通树变二叉树如何变?
在这个图里边,2是根结点的左子树结点,与2并列的3、4是2的兄弟结点,故转换成二叉树时,作为2的右子节点,类似的,5是3的左子树结点,故也是二叉树里3的左结点,6、7与5并列,就作为5的右子节点,类似的,4号结点也是一样。分析查找二叉树的一些递归条件:查找树的左、右子树各是一颗查找树...

树流程区别
它是一 棵左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。空树也是平衡二叉树。这是一个递归的定义,能充分表明二叉树的限制条件。2、平衡二叉树和红黑树 平衡二叉树的定义前面已经说了,如何保证其平衡有多种算法。单纯的平衡二叉树对搜索没有太大用处,只有平衡二叉...

二叉树表示命题公式
下面是对应表列:逻辑非替代符!合取替代符号*析取替代符号\/蕴含替代符号:等价替代符号=输入时只需要对公式的符号直接代换输入即可。2、运算程序仅支持使用大小写字母表示命题变项,且运算过程对大小写敏感。3、运算公式中仅允许小括号的出现,并且允许小括号的嵌套使用。4、如果要结束程序,请使用end命令。

高安市13335667177: 判断两个二叉树等价的算法 -
博服右倍: 判断二叉树a和b是否等价:1、 如果a==b,则a和b等价;2、 否则如果a或者b为空树或者a的data与b的data不等或者a的左子树与b的左子树不等价或者a的右子树与b的右子树不等价,则a和b不等...

高安市13335667177: C语言算法二叉树if(s&&Q[front])什么意思? -
博服右倍: if(s&&Q[front])等价于if(s !=0 && Q[front]!= 0)

高安市13335667177: 数据结构知识归纳
博服右倍: 第一章:数据结构概述 一、什么是数据结构 1、作者开篇谈到: 一般来说解决一个具体的问题时,大致需要经过下列几个步骤:首先要从具体的问题抽象出一个适当的数学模型,然后设计一个解此数学模型的算法,最后编写出程序代码,进行...

高安市13335667177: 计算机四级考试有哪些内容? -
博服右倍: 计算机四级考试大纲 基本要求 1、具有计算机及其应用的基础知识. 2、熟悉计算机操作系统、软件工程和数据库的原理及其应用. 3、具有计算机体系结构、系统组成和性能评价的基础及应用知识. 4、具有计算机网络和通信的基础知识. 5...

高安市13335667177: 计算机这种职业要具备什么技能和知识? -
博服右倍: 本来没有计算机这种职业,只有与计算机相关的职业.与计算机相关的职业又不是一种:办公文员、软件开发人员、计算机控制、数据分析等等.但是又一点可以肯定的就是凡是和计算机相关的职业必须具备计算机操作基本技能,即对操作系统的熟练度.

高安市13335667177: 计算机3级和4级哪个好考? -
博服右倍: 当然4级好啊~3级包括1、PC技术 熟悉汇编、对计算机硬件感兴趣的朋友们可以报考.这科考试侧重于个人计算机的硬件组成、原理等知识.上机为考核汇编.对于在校生来说,电子工程、仪表、自动化专业的考生可以报考,其所学和考试内容...

高安市13335667177: 计算机4级包括哪些内容? -
博服右倍: 上机测试内容 1.计算机操作能力. 2.C语言程序设计能力. 3.项目开发能力. 4.开发工具的使用能力. 考试方式 1.考试形式包括笔试(180分钟)和上机测试(60分钟). 2.笔试的试题包括选择题和论述题两种类型,其中在五分之一的选择题用...

高安市13335667177: 计算机四级考试怎么考、考什么? -
博服右倍: 考试科目:网络工程师、数据库工程师、软件测试工程师、信息安全工程师与嵌入式系统开发工程师,共五个考核项目.考试形式:无纸化考试.四级考试科目由五门专业基础课程中指定的两门课程组成,总分 100 分,两门课程各占 50 分.专...

高安市13335667177: 数据结构的考点是什么?
博服右倍:在计算机考研专业基础课统考科目中,一共考查数据结构、操作系统、计算机组成原理、计算机网络四门课程,满分为150分,其中数据结构占45分. 一、考查目标 (1)理解数据结构的基本概念,掌握数据的逻辑结构、存储结构及其差异,以...

高安市13335667177: 处理树形结构,为什么经常转换成二叉树 -
博服右倍: 1、因为树的遍历序列和二叉树等价,因此可以统一到用二叉树处理2、用二叉链表存储可以节约很多存储空间

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网