树二叉树Word文档下载推荐.docx

上传人:b****6 文档编号:21387846 上传时间:2023-01-30 格式:DOCX 页数:14 大小:145.17KB
下载 相关 举报
树二叉树Word文档下载推荐.docx_第1页
第1页 / 共14页
树二叉树Word文档下载推荐.docx_第2页
第2页 / 共14页
树二叉树Word文档下载推荐.docx_第3页
第3页 / 共14页
树二叉树Word文档下载推荐.docx_第4页
第4页 / 共14页
树二叉树Word文档下载推荐.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

树二叉树Word文档下载推荐.docx

《树二叉树Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《树二叉树Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。

树二叉树Word文档下载推荐.docx

在二叉树的第i层上至多有

结点(i>

=1)。

性质2:

深度为k的二叉树至多有

个结点(k>

性质3:

对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1。

性质4:

具有n个结点的完全二叉树的深度为

性质5:

如果对一棵有n个结点的完全二叉树的结点按层序编号,则对任一结点i(1=<

i=<

n)有:

(1)如果i=1,则结点i是二叉树的根,无双亲;

如果i>

1,则双亲PARENT(i)是结点[i/2]

(2)如果2i>

n,则结点i无左孩子(结点i为叶子结点);

否则其左孩子LCHILD(i)是结点2i

(3)如果2i+1>

n,则结点i无右孩子;

否则其右孩子RCHILD(i)是结点2i+1

性质6(补充):

具有n个结点的不同形态的二叉树B(n)=

如B(0)=1,B

(1)=1,B

(2)=2,B(3)=5……即Catalan数,Catalan数列为1,1,2,5,14,42,132,429,1430,4862,16796,…

令h(0)=1,它满足递归式h(n)=h(0)*h(n-1)+h

(1)*h(n-2)+...+h(n-1)h(0),该递推关式的解该递推关系的解为:

h(n)=c(2n,n)/(n+1)(n=1,2,3,...)

3.二叉树的实现

⑴二叉树的链式存储结构

二叉树有不同的链式结构,其中最常用的是二叉链表不屑一顾一叉链表。

二叉链表的结点形式如下:

lchild

data

rchild

其中,date域称为数据域,用于存储二叉树结点中的数据元素,lchild域称为左孩子域,用于存放指向本结点左孩子的(这个指针及指针域有时简称为左指针)。

类似地,rchild域称为右孩子指针域,用于存放指向本结点右孩子的指针(简称为右指针)。

二叉链表中的所有存储结点通过它们的左右指针的链接而形成一个整体。

此外,每个二叉链表还必须有一个指向根结点的指针,该指针称为根指针。

根指针具有标识二叉链表的作用,对二叉链表的访问能从根指针开始。

图4(a)、(b)分别表示一棵二叉树及其相应的二叉链表。

值得注意的是,二叉链表中每个存储结点的每个指针域必须有一个值,这个值或者是指向该结点的一个孩子的指针,或者是空指针nil. 

二叉链表的类型定义如下:

 type bitree=^node;

     node=record

         data:

datatype;

     //数据域

         lchild,rchild:

bitree;

//指针域

        end;

若二叉树为空,则root=nil。

若某结点的某个孩子不存在,则相应的指针为空。

具有n个结点的二叉树中,一共有2n个指针域,其中只有n-1个用来指向结点的的左右孩子,其余的n+1个指针域为空。

在二叉链表这种存储结构上,二叉树的多数基本运算如求根、求左、右孩子等很容易实现。

但求双亲运算PARENT(BT,X)的实现却比较麻烦,而且其时间性能不高。

假如在给定的实际问题中需要经常做求双亲运算,则在此场合下以二叉链表为存储结构显然不合适。

这时可以采用三叉链表作为存储结构。

三叉链表是二叉树的另一种主要的链式存储结构。

三叉链表与二叉链表的主要区别在于,它的结点比二叉链表的结点多一个指针域,该域用于存储一个指向本结点双亲的指针。

三叉链表的结点形式如下:

parent

(a)一棵二叉树BT

(b)BT的二叉链表示意图

(c)BT的三叉链表示意图

图二叉树链式存储结构示例

图4(C)为(a)所示二叉树的三叉链表存储表示。

显然,在三叉链表上,二叉树的求双亲运算PARENT(BT,X)很容易实现,而且其时间性能很好。

三叉链表的类型定义如下:

  type tritree=^node;

     node=record

         data:

    //数据域

         parent,lchild,rchild:

        end;

三叉的链式存储结构操作方便,表达简明,因而成为二叉树最常用的存储结构。

然而在某些情况下,二叉树的顺序存储结构也很有用。

⑵二叉树的顺序存储结构

此结构是将二叉树的所有结点,按照一定的次序,存储到一片连续的存储单元中。

因此,必须将结点排成一个适当的线性序列,使得结点在这个序列中的相应位置能反映出结点之间的逻辑关系。

这种结构特别适用于完全二叉树。

图二叉树的顺序存储结构

在一棵具有n个结点的完全二叉树中,我们从树根起,自上层到下层,逐层从左到右给所有结点编号,就能得到一个足以反映整个二叉树结构的线性序列。

其中每个结点的编号就作为结点的名称。

将数组下标作为结点名称(编号),就可将二叉树中所有结点的标号存储在一维数组中。

图完全二叉树的顺序存储结构

在二叉树的这种表示方式下,各结点之间的逻辑关系是隐含表示的。

完全二叉树中,除最下面一层外,各层都充满了结点。

可能除最底层外,每一层的结点个数恰好是上一层结点个数的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个结点的右单枝树却需要

个结点的存储空间。

例如,只有3个结点的右单枝树,如图7(a)所示,添上一些实际不存在的虚结点后,成为一棵完全二叉树,相应的顺序存储结构如图7(b)所示。

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

4.二叉树的遍历

遍历二叉树就是按一定的次序,系统地访问树中的所有结点,使每个结点恰好被访问一次。

所谓访问结点,其含义是很广的,可以理解为对结点的增、删、修改等各种运算的抽象。

在本节讨论中,假定访问结点即为输出结点数据域值。

二叉树的遍历是最重要和最基本的运算,二叉树的许多操作都是以遍历为基础的。

遍历二叉树的过程实际上就是按某种规律把二叉树的结点排成一个线性序列。

由于二叉树是非线性结构,它的每个结点都可能有两个分支,也就是说一个结点可能有两个后继,所以,二叉树的遍历比较复杂,按照不同规则遍历得到的结果也就不同。

令L、D、R分别表示遍历左子树、访问根结点和遍历右子树,则对二叉树的遍历有六种规律:

DLR、LDR、LRD、DRL、RDL、RLD。

若规定先左后右,则只有三种方案:

DLR、LDR和LRD,按照访问根的先后,分别称之为二叉树的先序(根)遍历,中序(根)遍历和后序(根)遍历。

  基于二叉树的递归定义,可得下述遍历二叉树的递归算法定义。

二叉树的三种遍历方式:

(1)先序遍历:

若二叉树为空,则空操作;

否则

①访问根结点;

②先序遍历左子树;

③先序遍历右子树。

(2)中序遍历:

①中序遍历左子树;

②访问根结点;

③中序遍历右子树。

(3)后序遍历:

①后序遍历左子树;

②后序遍历右子树。

③访问根结点;

显然,以上3种遍历方法都是采用递归的思想,下面以先序遍历为例给出递归算法:

Procedurepreorder(bt:

tree);

//先序遍历根结点为bt的二叉树的递归算法

Begin

Ifbt<

>

nilThenBegin

write(bt^.data);

preorder(bt^.lchild);

preorder(bt^.rchild);

 End;

End;

5.树、森林与二叉树的转换

⑴树转换为二叉树

步骤:

①加线:

亲兄弟之间加一虚连线。

②抹线:

抹掉(除最左一个孩子外)该结点到其余孩子之间的连线。

③旋转:

新加上去的虚线改实线且均向右斜(rchild),原有的连线均向左斜(lchild)。

图树转换为二叉树的操作过程

(a)一般树;

(b)加线后;

(c)抹线后;

(d)旋转后

⑵森林转换为二叉树

森林是树的有限集合,利用树的转换思想,可以实现森林到二叉树的转换。

①将各棵树分别转换为二叉树。

②按给出森林中树的次序,依次将后一棵二叉树作为前一棵二叉树根结点的右子树,则第一棵树的根结点是转换后二叉树的根。

图森林转换为二叉树的操作过程

(a)森林;

(b)各棵树对应的二叉树;

(c)转换成的二叉树

二、编程

1.求二叉树的先序遍历(NOIp2001,VijosP1132)

【Description】

给出一棵二叉树的中序与后序排列。

求出它的先序排列。

(约定树结点用不同的大写字母表示,长度≤8)。

【InputFormat】

第一行为二叉树的中序序列

第二行为二叉树的后序序列

【OutputFormat】

一行,为二叉树的先序序列样例

【SampleInput】

BADC

BDCA

【SampleOutput】

ABCD

2.FBI树(NOIp2004,VijosP1114)

【Description】

我们可以把由“0”和“1”组成的字符串分为三类:

全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串。

  FBI树是一种二叉树,它的结点类型也包括F结点,B结点和I结点三种。

由一个长度为2^N的“01”串S可以构造出一棵FBI树T,递归的构造方法如下:

  1)T的根结点为R,其类型与串S的类型相同;

  2)若串S的长度大于1,将串S从中间分开,分为等长的左右子串S1和S2;

由左子串S1构造R的左子树T1,由右子串S2构造R的右子树T2。

现在给定一个长度为2^N的“01”串,请用上述构造方法构造出一棵FBI树,并输出它的后序遍历序列。

【InputFormat】

输入的第一行是一个整数N(0<

=N<

=10),第二行是一个长度为2^N的“01”串

【OutputFormat】

输出包括一行,这一行只包含一个字符串,即FBI树的后序遍历序列。

3

10001011

IBFBBBFIBFIIIFF

3.加分二叉树(NOIp2003,VijosP1100)

设一个n个节点的二叉树tree的中序遍历为(l,2,3,…,n),其中数字1,2,3,…,n为节点编号。

每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都有一个加分,任一棵子树subtree(也包含tree本身)的加分计算方法如下:

subtree的左子树的加分×

subtree的右子树的加分+subtree的根的分数

若某个子树为空,规定其加分为1,叶子的加分就是叶节点本身的分数。

不考虑它的空子树。

试求一棵符合中序遍历为(1,2,3,…,n)且加分最高的二叉树tree。

要求输出;

(1)tree的最高加分

(2)tree的前序遍历

第1行:

一个整数n(n<30),为节点个数。

第2行:

n个用空格隔开的整数,为每个节点的分数(分数<100)。

一个整数,为最高加分(结果不会超过4,000,000,000)。

n个用空格隔开的整数,为该树的前序遍历。

5

571210

145

31245

附1历届NOIP初赛有关树和二叉树的试题

NOIP2008

●单选题

4.完全二叉树有2*N-1的结点,则它的叶子结点数目是()。

A.N-1B.2*NC.ND.2N-1E.N/2

●多选题:

16.二叉树T,已知其先序遍历是1243576(数字为节点编号,以下同),后序遍历是4275631,则该二叉树的中根遍历是()

A.4217536B.2417536C.4217563D.2415736

NOIP2007

14.已知7个节点的二叉树的先根遍历是1245637(数字为结点的编号,以下同),后根遍历是4652731,则该二叉树的可能的中根遍历是( 

 

A.4265173 

B.4256137

C.4231547 

D.4256173

NOIP2006

8.高度为n的均衡的二叉树是指:

如果去掉叶结点及相应的树枝,它应该是高度为n-1的满二叉树。

在这里,树高等于叶结点的最大深度,根结点的深度为0,如果某个均衡的二叉树共有2381个结点,则该树的树高为( 

 

)。

A.10 

B.11 

C.12 

D.13 

E.210–1

●多选题

14.已知6个结点的二叉树的先根遍历是123456(数字为结点的编号,以下同),后根遍历是325641,则该二叉树的可能的中根遍历是( 

A.321465 

B.321546   C.231546 

D.231465

NOIP2005 

13.二叉树T的宽度优先遍历序列为ABCDEFGHI,已知A是C的父结点,D是G的父结点,F是I的父结点,树中所有结点的最大深度为3(根结点深度设为0),可知E的父结点可能是()。

A.AB.BC.CD.DE.F

NOIP2004

4.满二叉树的叶结点个数为N,则它的结点总数为()。

A.NB.2*NC.2*N–1D.2*N+1E.2N–1

5.二叉树T,已知其前序遍历序列为1243576,中序遍历序列为4215736,则其后序遍历序列为()。

A.4257631B.4275631C.4275361

D.4723561E.4526371

NOIP2003

5.一个高度为h的二叉树最小元素数目是( 

)。

A)2h+1 

B)h 

C)2h-1 

D)2h 

E)2h-1

9.表达式(1+34)*5-56/7的后缀表达式为( 

A)1+34*5-56/7 

B)-*+1345/567 

C)134+5*567/-

D)1345*+567/- 

E)134+5567-*/

NOIP2002

17.按照二叉数的定义,具有3个结点的二叉树有()种。

A)3B)4C)5D)6

●问题求解

2.设有一棵k叉树,其中只有度为0和k两种结点,设n0,nk,分别表示度为0和度为k的结点个数,试求出n0和nk之间的关系(n0=数学表达式,数学表达式仅含nk、k和数字)。

NOIP2001

19.一棵二叉树的高度为h,所有结点的度为0,或为2,则此树最少有()个结点

 A)2h-1 B)2h-1 C)2h+1 D)h+1

1.已知一棵二叉树的结点名为大写英文字母,其中序与后序遍历的顺序分别为:

CBGEAFHDIJ与CGEBHFJIDA则该二叉树的先序遍历的顺序为。

NOIP2000:

●单选题:

12.在有N个叶子节点的哈夫曼树中,其节点总数为()

A.不确定B.2N-1C.2N+1D.2N

●问题求解:

1.已知,按中序遍历二叉树的结果为:

abc

问:

有多少种不同形态的二叉树可以得到这一遍历结果,并画出这些二叉树。

其它试题:

⑴ 设一棵完全二叉树有700个结点,则在该二叉树中有     个叶子结点。

⑵ 一棵有124个叶结点的完全二叉树,最多有个结点。

⑶ 在一棵度为3的树中,度为3的结点数为2个,度为2的结点数为1个,度为1的结点数为2个,则度为0的结点数为    个。

A、4B、5C、6D、7

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1