树二叉树.docx
- 文档编号:8251558
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:14
- 大小:145.17KB
树二叉树.docx
《树二叉树.docx》由会员分享,可在线阅读,更多相关《树二叉树.docx(14页珍藏版)》请在冰豆网上搜索。
树二叉树
树——二叉树
引:
为何要重点研究二叉树?
(1)二叉树的结构最简单,规律性最强;
(2)可以证明,所有树都能转为唯一对应的二叉树,不失一般性。
一、二叉树基础
1.二叉树的定义
二叉树是一类非常重要的树形结构,它可以递归地定义如下:
二叉树T是有限个结点的集合,它或者是空集,或者由一个根结点以及分别称为左子树和右子树的两棵互不相交的二叉树。
因此,二叉树的根可以有空的左子树或空的右子树,或者左、右子树均为空。
二叉树有5种基本形态,如图1所示。
图二叉树的5种基本形态
在二叉树中,每个结点至多有两个儿子,并且有左、右之分。
因此任一结点的儿子不外4种情况:
没有儿子;只有一个左儿子;只有一个右儿子;有一个左儿子并且有一个右儿子。
注意:
二叉树与树和有序树的区别
二叉树与度数不超过2的树不同,与度数不超过2的有序树也不同。
在有序树中,虽然一个结点的儿子之间是有左右次序的,但若该结点只有一个儿子时,就无须区分其左右次序。
而在二叉树中,即使是一个儿子也有左右之分。
例如图2-1中(a)和(b)是两棵不同的二叉树。
虽然它们与图2-2中的普通树(作为无序树或有序树)很相似,但它们却不能等同于这棵普通的树。
若将这3棵树均看作是有序树,则它们就是相同的了。
图-1两棵不同的二叉树
图-2一棵普通的树
由此可见,尽管二叉树与树有许多相似之处,但二叉树不是树的特殊情形。
2.二叉树的性质
图二叉树
性质1:
在二叉树的第i层上至多有
结点(i>=1)。
性质2:
深度为k的二叉树至多有
个结点(k>=1)。
性质3:
对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1。
性质4:
具有n个结点的完全二叉树的深度为
性质5:
如果对一棵有n个结点的完全二叉树的结点按层序编号,则对任一结点i(1=
(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)的实现却比较麻烦,而且其时间性能不高。
假如在给定的实际问题中需要经常做求双亲运算,则在此场合下以二叉链表为存储结构显然不合适。
这时可以采用三叉链表作为存储结构。
三叉链表是二叉树的另一种主要的链式存储结构。
三叉链表与二叉链表的主要区别在于,它的结点比二叉链表的结点多一个指针域,该域用于存储一个指向本结点双亲的指针。
三叉链表的结点形式如下:
data
lchild
parent
rchild
(a)一棵二叉树BT
(b)BT的二叉链表示意图
(c)BT的三叉链表示意图
图二叉树链式存储结构示例
图4(C)为(a)所示二叉树的三叉链表存储表示。
显然,在三叉链表上,二叉树的求双亲运算PARENT(BT,X)很容易实现,而且其时间性能很好。
三叉链表的类型定义如下:
type tritree=^node;
node=record
data:
datatype; //数据域
parent,lchild,rchild:
bitree;//指针域
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树的后序遍历序列。
【SampleInput】
3
10001011
【SampleOutput】
IBFBBBFIBFIIIFF
3.加分二叉树(NOIp2003,VijosP1100)
【Description】
设一个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的前序遍历
【InputFormat】
第1行:
一个整数n(n<30),为节点个数。
第2行:
n个用空格隔开的整数,为每个节点的分数(分数<100)。
【OutputFormat】
第1行:
一个整数,为最高加分(结果不会超过4,000,000,000)。
第2行:
n个用空格隔开的整数,为该树的前序遍历。
【SampleInput】
5
571210
【SampleOutput】
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二叉
![提示](https://static.bdocx.com/images/bang_tan.gif)