二叉树最大宽度和高度
二叉树最大宽度和高度
题目描述Description
给出一个二叉树,输出它的最大宽度和高度。
输入描述Input Description
第一行一个整数n。
下面n行每行有两个数,对于第i行的两个数,代表编号为i的节点所连接的两个左右儿子的编号。
如果没有某个儿子为空,则为0。
输出描述Output Description
输出共一行,输出二叉树的最大宽度和高度,用一个空格隔开。
样例输入Sample Input
5
2 3
4 5
0 0
0 0
0 0
样例输出Sample Output
2 3
#include<stdio.h>
#include<string.h>
int a[1000][2],b[1000];
int i,x,y,n;
void dns(int i,int k) //k表示第k层
{
b[k]=b[k]+1;
if(k > x)
x = k;
if(a[i][0])
dns(a[i][0],k+1);
if(a[i][1])
dns(a[i][1],k+1);
}
int main()
{
scanf("%d",&n); //读入节点个数
memset(a,0,sizeof(a)); //将a,b数组值置零
memset(b,0,sizeof(b));
for(i=1;i<=n;i++) //循环读入节点值
scanf("%d%d",&a[i][0],&a[i][1]);
x=0; //用x保存最大高度
dns(1,1);
y=0; //用y保存最大宽度
for(i=1;i<n;i++) //在各层宽度中寻找最大宽度if(b[i]>y)
y=b[i];
printf("%d %d\n",y,x); //输出二叉树的最大宽度和最大高度return 0;
}。
二叉树知识点总结
二叉树知识点总结1. 二叉树的性质1.1 二叉树的性质一:二叉树的深度二叉树的深度是指从根节点到叶子节点的最长路径长度。
对于一个空树而言,它的深度为0;对于只有一个根节点的树而言,它的深度为1。
根据定义可知,深度为k的二叉树中,叶子节点的深度值为k。
由此可知,二叉树的深度为所有叶子节点深度的最大值。
1.2 二叉树的性质二:二叉树的高度二叉树的高度是指从根节点到叶子节点的最短路径长度。
对于一个空树而言,它的高度为0;对于只有一个根节点的树而言,它的高度为1。
由此可知,二叉树的高度总是比深度大一。
1.3 二叉树的性质三:二叉树的节点数量对于一个深度为k的二叉树而言,它最多包含2^k - 1个节点。
而对于一个拥有n个节点的二叉树而言,它的深度最多为log2(n+1)。
1.4 二叉树的性质四:满二叉树满二叉树是一种特殊类型的二叉树,它的每个节点要么是叶子节点,要么拥有两个子节点。
满二叉树的性质是:对于深度为k的满二叉树而言,它的节点数量一定是2^k - 1。
1.5 二叉树的性质五:完全二叉树完全二叉树是一种特殊类型的二叉树,它的所有叶子节点都集中在树的最低两层,并且最后一层的叶子节点从左到右依次排列。
对于一个深度为k的完全二叉树而言,它的节点数量一定在2^(k-1)和2^k之间。
2. 二叉树的遍历二叉树的遍历是指按照一定的顺序访问二叉树的所有节点。
二叉树的遍历主要包括前序遍历、中序遍历和后序遍历三种。
2.1 前序遍历(Pre-order traversal)前序遍历的顺序是:根节点 -> 左子树 -> 右子树。
对于一个二叉树而言,前序遍历的结果就是按照“根-左-右”的顺序访问所有节点。
2.2 中序遍历(In-order traversal)中序遍历的顺序是:左子树 -> 根节点 -> 右子树。
对于一个二叉树而言,中序遍历的结果就是按照“左-根-右”的顺序访问所有节点。
2.3 后序遍历(Post-order traversal)后序遍历的顺序是:左子树 -> 右子树 -> 根节点。
西大 2001 年试题与分析
西大 2001 年试题与分析试题部分一、问答题1 .不限制 GOTO ,会带来什么问题。
说明 GOTO 与结构化程序设计的关系。
2 .面向对象的程序设计方法的特点是什么?说明封装的含义。
3 .什么是函数的副作用?4 .简述数组与字符串属于线性表的理由。
二、选择题1 .在下列算法中, __________ 算法可能出现下列情况;在最后一趟开始之前,所有的元素都不在其最终的位置上。
A .堆排序B .冒泡排序C .插入排序D .快速排序2 .堆排序是 __________ 类排序,堆排序平均执行的时间复杂度和需要附加的存储空间复杂度分别是__________ 。
A .插入B .交换C .归并D .基数E .选择F . O(n 2 ) 和 O(1)G . O(nlog 2 n) 和 O(1) H.O(nlog 2 n) 和 O(n) I.O(n2 ) 和 O(n)三、写出结果1 .已知二叉树有 50 个叶子结点,则该二叉树的总结点数至少应有多少个?2 .在后序线索树中,要找出 X 结点的前驱结点,请写出相关语句。
LtagLcDataRtagRc3 .带权结点为 {5 , 6 , 7 , 8 , 9} ,构造 Huffman 树,计算带权路径长度。
4 .对一个堆,按二叉树层次进行遍历,是否可以得到一个有序序列,为什么?5 .在快速排序算法中能否用队列代替栈,说明原因。
6 .已知二叉树采用二叉链表方式存放,要求返回二叉树 T 的后序序列中的第一个结点的指针,是否可不用递归且不用栈来完成?请简述原因。
7 .对下面过程写出调用 P(3) 的运行结果。
PROCEDURE p(w:integer);BEGINIF w>0 THEN GEGINp(w-1);writeln(w); { 输出 w}p(w-1)END;END;8 .已知长度为 12 的表( Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec ),按表中顺序依次插入初始为空的二叉排序树中。
实验三:二叉树操作
(3)前序遍历当前节点的右子树。
中序遍历树:
(1)声明一个顺序栈,并用p指针指向当前节点。
(2)若当前节点和栈不同时为空则重复进行下一步。否则程序结束
(3)若当前节点不为空则重复进行第四步,否则执行第五步。
(4)在栈不满的情况下将当前节点入栈,并把p指针指向当前节点左子树的根节点。
二、实验题目与要求
1.每位同学按下述要求实现相应算法:以二叉链表为存储结构,实现二叉树的创建、遍历算法
1)问题描述:在主程序中提供下列菜单:
1…建立树
2…前序遍历树
3…中序(非递归)遍历树
4…后序遍历树 0…结束
2)实验要求:
① 定义下列过程:
CreateTree(): 按从键盘输入的前序序列,创建树
T->lchild = CreateTree();
T->rchild = CreateTree();
}
returnT;
}
voidPreOrder(BitNode *T)
{
if(T == NULL)return;
printf("%c",T->data);
PreOrder(T->lchild);
PreOrder(T->rchild);
T->rchild = temp;
Exchange(T->lchild);
Exchange(T->rchild);
returnT;
}
intmain()
{
BitTree *root;
root = CreateTree();
printf("中序遍历原二叉树:");
数据结构用非递归算法求二叉树高度
数据结构⽤⾮递归算法求⼆叉树⾼度算法思想: 采⽤层次遍历的算法,设置变量level记录当前节点所在层数,设置变量last指向当前层的最右结点,每层遍历出队时与last指针⽐较,若两者相等,则层数加⼀,并让last指向下⼀层的最右结点即rear所在位置,直到变量完成。
level的值即为⼆叉树的⾼度。
代码如下:1int Btdepth(BiTree T)2 {3if(T==NULL) //树空⾼度为04return0;5int front=rear=-1;6int last=level=0; //last指向当前层的最右结点7 BiTree Q[MAXSIZE]; //设置队列Q,元素是⼆叉树结点指针且容量⾜够8 Q[++rear]=T; //将根节点⼊队9 BiTree p=T;10while(!IsEmpty(Q)) //11 {12 p=Q[++front]; //队列元素出队,即正在访问的结点13if(p->lchild)14 Q[++rear]=p->lchild; //左孩⼦⼊队15if(p->rchild)16 Q[++rear]=p->rchild; //右孩⼦⼊队17if(front==last) //访问到该层的最后⼀个结点18 {19 level++; //⾼度加⼀20 last=rear; //更新last指向下⼀层最右⼀个结点21 }2223 }24return level;25 }扩展:求某⼀层的结点个数,每层的结点个数、树的最⼤宽度,都采⽤与此题类似的思想。
当然,此题可采⽤递归算法,其实现如下代码如下:1int Btdepth(BiTree T)2 {3if(T==NULL) //空树⾼度为04return0;5 ldep=Btdepth(T->lchild); //递归遍历左⼦树6 rdep=Btdepth(T->rchild); //递归遍历右⼦树7if(ldep>rdep) //树的⾼度为⼦树的最⼤⾼度加根节点8return ldep+1;9else10return rdep+1;11 }。
二叉树概述
=0.xx =1; 若结点个数n=3,则有深度k=1,满足k=lb(3+1)-1=1。
二叉树概述
1.二叉树的定义
一、二叉树:是n(n≥0)个结点的有限集合。n=0的树称为空二叉树;n>0的二叉树由 一个根结点以及两棵互不相交的、分别称为左子树和右子树的二叉树组成 。
逻辑结构: 一对二(1:2) 基本特征: ① 每个结点最多只有两棵子树(不存在度大于2的结点); ② 左子树和右子树次序不能颠倒。所以下面是两棵不同的树 注意:二叉树不是有序树
3.二叉树的性质
性质1 在一棵非空二叉树的第i层上至多有2i个结点(i≥0)。
性质2 深度为k的二叉树至多有2k+1-1个结点。 说明:深度k=-1,表示没有一个结点;深度k=0,表示只有一个根结点。
性质3 对于一棵非空的二叉树,如果叶结点个数为n0,度为2的结点数为n2, 则有 n0= n2+1。 证明:设n为二叉树的结点总数,n1为二叉树中度为1的结点个数,则有: n = n0 + n1 + n2
A
B
C
D
E
F
G
H I J K L MN O
A
B
C
D
E
F
G
H IJ
(a)满二叉树
(b)完全二叉树
问题:一个高度为h的完全二叉树最多有多少个结点?最少有多少个结点?
正则二叉树
正则二叉树正则二叉树是一个数学名词。
在根树中,若每个分支点的出度小于或等于m,则称该树为m叉树。
如果每个分支点的出度恰好等于m,则称该树为m叉正则树。
m=2时,该根树称为二叉正则树。
若其所有树叶层次相同,称为二叉完全正则树要理解什么是二叉树正则,必须了解树、有向树、根树、叉树等概念。
一个连通且无回路的无向图,称为树。
如果有向图在不考虑边的方向时,是一棵树,那么这个有向图称为有向树。
若一棵有向树,恰有一个结点入度为0,其余所有结点的入度均为1,则称该有向树为根树。
扩展资料树的概念下图我们日常生活中所见到的树,可以看到,从主树干出发,向上衍生出很多枝干,而每一根枝干,又衍生出一些枝丫,就这样组成了我们在地面上可以看到的树的结构,但对于每一个小枝丫来讲,归根结底,还是来自于主树干的层层衍生形成的。
我们往往需要在计算机中解决这样一些实际问题例如:•用于保存和处理树状的数据,例如家谱,组织机构图•进行查找,以及一些大规模的数据索引方面•高效的对数据排序先不提一些复杂的功能,就例如对于一些有树状层级结构的数据进行建模,解决实际问题,我们就可以利用“树” 这种结构来进行表示,为了更符合我们的习惯,我们一般把“树” 倒过来看,我们就可以将其归纳为下面这样的结构,这也就是我们数据结构中的“ 树”树中的常见术语•结点:包含数据项以及指向其他结点的分支,例如上图中圆A 中,既包含数据项A 又指向 B 和 C 两个分支•特别的,因为A 没有前驱,且有且只有一个,所以称其为根结点•子树:由根结点以及根结点的所有后代导出的子图称为树的子树•例如下面两个图均为上面树中的子树•结点的度:结点拥有子树的数目,简单的就是直接看有多少个分支,例如上图A 的度为2,B的度为1•叶结点:也叫作终端结点,即没有后继的结点,例如E F G H I•分支结点:也叫作非终端结点,除叶结点之外的都可以这么叫•孩子结点:也叫作儿子结点,即一个结点的直接后继结点,例如B 和C 都是A 的孩子结点•双亲结点:也叫作父结点,一个结点的直接前驱,例如A 是B 和C 的双亲结点•兄弟结点:同一双亲的孩子结点互称为兄弟结点例如B 和C 互为兄弟•堂兄弟:双亲互为兄弟结点的结点,例如D 和E 互为堂兄弟•祖先结点:从根结点到达一个结点的路径上的所有结点,A B D 结点均为H 结点的祖先结点•子孙结点:以某个结点为根的子树中的任意一个结点都称为该结点的子孙结点,例如C 的子孙结点有 E F I•结点的层次:设根结点层次为1,其余结点为其双亲结点层次加1,例如,A 层次为1,BC 层次为2•树的高度:也叫作树的深度,即树中结点的最大层次•有序/无序树:树中结点子树是否从左到右为有序,有序则为有序树,无序则为无序树可能大家也看到了,上面我举的例子,分支全部都在两个以内,这就是我们今天所重点介绍的一种树——“二叉树”二叉树在计算机科学中,二叉树(英语:Binary tree)是每个结点最多只有两个分支(即不存在分支度大于2的结点)的树结构。
二叉树
我们也可以把递归过程改成用栈实现的非递归过程,下面给出先序 遍历的非递归过程: procedure inorder(bt:tree); var stack:array[1..n] of tree; {栈} top:integer; {栈顶指针} p:tree; begin top:=0; while not ((bt=nil)and(top=0)) do begin
• ⑴如果i=1,则结点i为根,无父结点;如果i>1,则其 父结点编号为trunc(i/2)。 • ⑵如果2*i>n,则结点i为叶结点;否则左孩子编号为 2*i。 • ⑶如果2*i+1>n,则结点i无右孩子;否则右孩子编号 为2*i+1。
存储结构
• 二叉树的存储结构和普通树的存储结构基本相同,有链 式和顺序存储两种方法。 • ⑴链式存储结构:有单链表结构或双链表结构,基本数 据结构定义如下: type tree=^node;{单链表结构} node=record data:char;{数据域} lchild,rchild:tree;{指针域:分别指向左、右孩子} end; var bt:tree;
• 输入: • 其中第一行一个整数n,表示树的结点数。接下来的n行 每行描述了一个结点的状况,包含了三个整数,整数之 间用空格分隔,其中:第一个数为居民人口数;第二个 数为左链接,为0表示无链接;第三个数为右链接。 • 输出: • 只有一个整数,表示最小距离和。
• • • • • • • •
样例 输入: 5 13 2 3 4 0 0 12 4 5 20 0 0 40 0 0
2、删除二叉树 procedure dis(var bt:tree); begin if bt<>nil then begin dis(bt^.lchild); dis(bt^.rchild); dispose(bt); end; end;
Visio-公式配置--二叉树
叶子结点个数(nLeftLeafs)
3、二叉树绘图区域左上角坐标计算:
完全二叉树叶子结点个数:nLeafs = Pow(2,nMaxDepth-1)
x0 = xRoot - ((nNodeWidth+nLeafHSpace) * nLeafs + nLeafHSpace)/2
y0 = yRoot - nLineVSpace ;
KIndex ; //结点序号,唯一性标示结点
的求和获取平均年值。外部函数调用所需四个参数(数据
Key ; //关键字,叶子结点或扩展结点取值公式表的ID,否则为空 表名称,关键字字段名,关键字字段值,求值字段名)
Val ; //结点值,
ID PID Val
如果结点为叶子结点,则取值公式表的ID
---------------------
3、编辑一个设计状态(森林) 4、保存森林状态(森林) 5、添加பைடு நூலகம்棵空树 6、删除一棵树结点 二、二叉树 1、添加一个结点
2、删除一个结点
3、编辑一个结点
4、从公式生成二叉树
F=((F1+F2)*F3)-IF((((F1+F2)>F3) and (F5>F6)),F8,F9)
5、从二叉树生成公式
pHead
DSTSumRecords(TableName,FieldKeyName,FieldKeyVal,FieldValNam
F5 0 -1 “” ReadRecord(Table,”ID”,”D1",”Val”) e)
F6 0 -1 “” SumRecords(Table,”PID”,”0",”Val”) 字段值求平均值(表名,关键字字段名,关键字字段值,值字段名)
计算机二级公共基础专题探究——二叉树
公共基础专题探究——二叉树1.6 树与二叉树树是一种简单的非线性结构,所有元素之间具有明显的层次特性。
在树结构中,没有前件的结点只有一个,称为树的根结点,简称树的根。
每一个结点可以有多个后件,称为该结点的子结点。
没有后件的结点称为叶子结点。
在树结构中,一个结点所拥有的后件的个数称为该结点的度,所有结点中最大的度称为树的度。
为该结点的左子树与右子树。
二叉树的基本性质:必考的题目(1)在二叉树的第k层上,最多有2k-1(k≥1)个结点;(2)深度为m的二叉树最多有2m-1个结点;(3)度为0的结点(即叶子结点)总是比度为2的结点多一个;(4)二叉树中 n = n0 +n1 +n2k层上有2k-1个结点深度为m的满二叉树有2m-1个结点。
若干结点。
二叉树的遍历:(一般画个图要你把顺序写出来)后序遍历(访问根结点在访问左子树和访问右子树之后)重点题型:二叉树的遍历例1:某二叉树的前序序列为ABCD,中序序列为DCBA,则后序序列为(DCBA )。
【解析】前序序列为ABCD,可知A为根结点。
根据中序序列为DCBA可知DCB是A的左子树。
根据前序序列可知B是CD的根结点。
再根据中序序列可知DC是结点B的左子树。
根据前序序列可知,C是D的根结点,故后序序列为DCBA例2:对下列二叉树进行前序遍历的结果为 ABDYECFXZ例3:设二叉树如下,则后序序列为 DGEBHFCA【解析】本题中前序遍历为ABDEGCFH,中序遍历为DBGEAFHC,后序遍历为DGEBHFCA完全二叉树指除最后一层外,每一层上的结点数均达到最大值,在最后堆排序问题:例1:已知前序序列与中序序列均为ABCDEFGH,求后序序列【解析】设根节点为D≠0,左子树为L,右子树为R,有遍历顺序为:前:D-L-R 已知ABCDEFGH中:L-D-R 已知ABCDEFGH后:L-R-D 待求由此可知,L=0,D-R= ABCDEFGH故R-D=HGFEDCBA,即后序序列= HGFEDCBA变式训练1:已知后序序列与中序序列均为ABCDEFGH,求前序序列答案:HGFEDCBA,(这次R=0)结论:若前序序列与中序序列均为某序列,则后序序列为该序列的倒序,且为折线;同样地,若后序序列与中序序列均为某序列,则前序序列为该序列的倒序,且为折线例2:已知前序序列=ABCD,中序序列=DCBA,求后序序列【解析】设根节点为D≠0,左子树为L,右子树为R,有遍历顺序为:前:D-L-R 已知ABCD中:L-D-R 已知DCBA后:L-R-D 待求因为ABCD与DCBA正好相反,由此可知,R=0所以D-L=ABCD,即L-D=DCBA所以后序序列= DCBA变式训练2-1:中序序列=BDCA,后序序列=DCBA,求前序序列【解析】设根节点为D≠0,左子树为L,右子树为R,有遍历顺序为:前:D-L-R 待求中:L-D-R 已知BDC,A后:L-R-D 已知DCB,A通过观察可知,R=0,L={B,D,C},D=A中、后变换时,{B,D,C}发生了变化,说明左子树结构特殊,进一步令中’:L’-D’-R’已知B,DC后’:L’-R’-D’已知DC,B可知L’=0,即D’=B,R’= DC可以画出二叉树示意图为:Array所以前序序列= ABCD变式训练2-2:中序序列=ABC,后序序列=CBA,求前序序列【解析】设根节点为D≠0,左子树为L,右子树为R,有遍历顺序为:前:D-L-R 待求中:L-D-R 已知ABC后:L-R-D 已知通过观察可知,L=0,D-R=ABC,R-D=CBA所以前序序列=D-L-R= D-R=ABC变式训练2-3:前序序列=ABC,中序序列=CBA,求后序序列【解析】设根节点为D≠0,左子树为L,右子树为R,有遍历顺序为:前:D-L-R 已知A,BC中:L-D-R 已知CB,A后:L-R-D 待求通过观察可知,D=A ,L={B,C},R=0所以后序序列=CBA (一边偏)题型二:求二叉树的深度。
数据结构二叉树习题含答案
第6章树和二叉树1.选择题(1)把一棵树转换为二叉树后,这棵二叉树的形态是()。
A.唯一的B.有多种C.有多种,但根结点都没有左孩子D.有多种,但根结点都没有右孩子(2)由3 个结点可以构造出多少种不同的二叉树?()A.2 B.3 C.4 D.5(3)一棵完全二叉树上有1001个结点,其中叶子结点的个数是()。
A.250 B. 500 C.254 D.501(4)一个具有1025个结点的二叉树的高h为()。
A.11 B.10 C.11至1025之间 D.10至1024之间(5)深度为h的满m叉树的第k层有()个结点。
(1=<k=<h)A.m k-1 B.m k-1 C.m h-1 D.m h-1(6)利用二叉链表存储树,则根结点的右指针是()。
A.指向最左孩子 B.指向最右孩子 C.空 D.非空(7)对二叉树的结点从1开始进行连续编号,要求每个结点的编号大于其左、右孩子的编号,同一结点的左右孩子中,其左孩子的编号小于其右孩子的编号,可采用()遍历实现编号。
A.先序 B. 中序 C. 后序 D. 从根开始按层次遍历(8)若二叉树采用二叉链表存储结构,要交换其所有分支结点左、右子树的位置,利用()遍历方法最合适。
A.前序 B.中序 C.后序 D.按层次(9)在下列存储形式中,()不是树的存储形式?A.双亲表示法 B.孩子链表表示法 C.孩子兄弟表示法D.顺序存储表示法(10)一棵非空的二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树一定满足()。
A.所有的结点均无左孩子B.所有的结点均无右孩子C.只有一个叶子结点 D.是任意一棵二叉树(11)某二叉树的前序序列和后序序列正好相反,则该二叉树一定是()的二叉树。
A.空或只有一个结点 B.任一结点无左子树C.高度等于其结点数 D.任一结点无右子树(12)若X是二叉中序线索树中一个有左孩子的结点,且X不为根,则X的前驱为()。
A.X的双亲 B.X的右子树中最左的结点C.X的左子树中最右结点 D.X的左子树中最右叶结点(13)引入二叉线索树的目的是()。
