第6章 树

合集下载

第六章 树

第六章 树

第六章树一、选择题1.对于一棵具有n个结点的树,该树中所有结点的度数之和为________。

A. n-1 B. n C. n+1 D. (n+1)/22.设结点A 有3个兄弟结点且结点B为结点A的双亲结点,则结点B 的度数为________。

A. 3 B. 4 C.5 D. 13.根据二叉树的定义可知二叉树共有________种不同的形态。

A. 4 B. 5 C. 6 D. 74.在一棵树中,________没有前驱结点。

A. 分支结点B. 叶结点C. 树根结点D. 空结点5.设某棵二叉树中只有度数为0和度数为2的结点,且度数为0的结点数为 n,则这棵二叉中共有________个结点。

A. 2n B.n+1 C. 2n-1 D.2n+16.设某棵二叉树的高度为10,则该二叉树上叶子结点最多有________。

A. 20 B.256 C. 512 D.10247.一棵具有5层满二叉树中结点总数为________。

A. 31 B. 32 C.33 D.168. 如下图所示的4 棵二叉树,_______不是完全二叉树。

9.具有65个结点的完全二叉树的高度为________。

(根的层次号为1)A.8B.7C.6D.510.把一棵深度4的左单支二叉树改造成完全二叉树时,要增添个空结点。

A.10 B.8 C.6 D.411.设按照从上到下、从左到右的顺序从 1 开始对完全二叉树进行顺序编号,则编号为 i结点的左孩子结点的编号为________。

A. 2i+1 B. 2i C. i/2 D. 2i-112.首先访问结点的左子树,然后访问该结点,最后访问结点的右子树,这种遍历称为________。

A.前序遍历B.后序遍历C.中序遍历D.层次遍历13.已知一棵二叉树的前序遍历结果为 ABCDEF ,中序遍历结果为 CBAEDF,则后序遍历的结果为________。

A.CBEFDA B. FEDCBA C. CBEDFA D. 不定14.已知某二叉树的后序遍历序列是 dabec, 中序遍历序列是 debac,它的前序遍历序列是________。

数据结构-第6章 树和二叉树---4. 树和森林(V1)

数据结构-第6章 树和二叉树---4. 树和森林(V1)
ElemType data ; struct CSnode *firstchild, *nextsibing ; }CSNode;
6.4.1 树的存储结构
R AB C D EG F
R⋀
A
⋀D
⋀B
⋀E ⋀
C⋀
⋀G
⋀F ⋀
6.4.2 树、森林和二叉树的转换
1. 树转换为二叉树 将树转换成二叉树在“孩子兄弟表示法”中已 给出,其详细步骤是: ⑴ 加线。在树的所有相邻兄弟结点之间加一 条连线。 ⑵ 去连线。除最左的第一个子结点外,父结点 与所有其它子结点的连线都去掉。 ⑶ 旋转。将树以根结点为轴心,顺时针旋转 450,使之层次分明。
B C
D
A E
L HK
M
技巧:无左孩子 者即为叶子结点
6.4.3 树和森林的遍历
1. 树的遍历 由树结构的定义可知,树的遍历有二种方法。 ⑴ 先序遍历:先访问根结点,然后依次先序 遍历完每棵子树等。价于对应二叉树的先序遍历
⑵ 后序遍历:先依次后序遍历完每棵子树,然 后访问根结点。等价于对应二叉树的中序遍历
0 R -1 1A 0 2B 0 3C 0
}Ptree ; R
4D 1 5E 1
AB C
6F 3
7G 6
DE
F
8H 6
9I 6
G H I 10~MAX_Size-1 ... ...
6.4.1 树的存储结构
2. 孩子表示法
每个结点的孩子结点构成一个单链表,即有n 个结点就有n个孩子链表;
n个孩子的数据和n个孩子链表的头指针组成一 个顺序表; 结点结构定义: 顺序表定义:
typedef struct PTNode { ElemType data ;

第6章树和二叉树

第6章树和二叉树
2.孩子表示法 孩子表示法 在结点中设置指向每个孩子的指针域, 在结点中设置指向每个孩子的指针域,利用指针 指向该结点的所有孩子结点。 指向该结点的所有孩子结点。 大多采用按树的度设置结点的指针域的个数。 大多采用按树的度设置结点的指针域的个数。
9
6.1.4 树的存储结构
3.孩子兄弟表示法 孩子兄弟表示法 在结点中设置两个指针域, 在结点中设置两个指针域,一个指针域指向该结 点的第一个孩子,另一个指针域指向其右兄弟。 点的第一个孩子,另一个指针域指向其右兄弟。
2
6.1.1树的定义 树的定义
结点的度:结点所拥有子树的个数称为结点的度。 结点的度:结点所拥有子树的个数称为结点的度。 子树 称为结点的度 树的度:树中所有结点的度的最大值称为树的度。 最大值称为树的度 树的度:树中所有结点的度的最大值称为树的度。 叶结点:度为零的结点称为叶结点。也称终端结点 终端结点或 叶结点:度为零的结点称为叶结点。也称终端结点或叶 子 分支结点:度不为零的结点称为分支结点。也称非终端 分支结点:度不为零的结点称为分支结点。也称非终端 结点。除根结点以外,分支结点也称为内部结点。 结点。除根结点以外,分支结点也称为内部结点。 孩子结点和双亲结点: 孩子结点和双亲结点:树中一个结点的子树的根结点称 为孩子结点。该结点就称为孩子结点的双亲结点。 为孩子结点。该结点就称为孩子结点的双亲结点。 兄弟结点:具有同一双亲的孩子结点互为兄弟结点。 兄弟结点:具有同一双亲的孩子结点互为兄弟结点。 结点的祖先:从根到该结点所经分支上的所有结点, 结点的祖先:从根到该结点所经分支上的所有结点,称 为结点的祖先。 为结点的祖先。
17
6.2.2 二叉树的性质
性质4 具有n( 性质 具有 (n>0)个结点的完全二叉树的深度 )个结点的完全二叉树的深度h= log 2 n + 1 证明: 证明: 根据完全二叉树的定义可知深度为h-1层及以上的结点构成 根据完全二叉树的定义可知深度为 层及以上的结点构成 满二叉树,因此由性质2得深度为 得深度为h的完全二叉树满足 满二叉树,因此由性质 得深度为 的完全二叉树满足 n>2h-1-1和n≤2h-1 和 整理后得到 2h-1≤n<2h 不等式两边取对数, 不等式两边取对数,得 h-1≤log2n<h 由于h为正整数 为正整数, 由于 为正整数,因此 h= log 2 n + 1

第6章演示

第6章演示
返回
二叉树的性质
性质1:二叉树第i层上的结点数目最多为2i-1(i≥1)。 性质2:深度为k的二叉树至多有2k-1个结点(k≥1)。 性质3:在任意一棵二叉树中,若终端结点的个数为 n0,度为2的结点数为n2,则n0=n2+1。
返回
满二叉树和完全二叉树
满二叉树和完全二叉树是二叉树的两种特殊情形。 1、满二叉树(FullBinaryTree) 一棵深度为k且有2k-1个结点的二叉树称为满二叉树。 满二叉树的特点: (1)每一层上的结点数都达到最大值。即对给定的高度, 它是具有最多结点数的二叉树。 (2)满二叉树中不存在度数为1的结点,每个分支结点 均有两棵高度相同的子树,且树叶都在最下一层上。
满二叉树和完全二叉树
2、完全二叉树(Complete BinaryTree) 若一棵二叉树至多只有最下面的两层上结点的度 数可以小于2,并且最下一层上的结点都集中在该层 最左边的若干位置上,则此二叉树称为完全二叉树。 具有n个结点,其形状与满二叉树按层编号的前n 个结点的位置顺序一一对应。 完全二叉树的特点: (1)满二叉树是完全二叉树,完全二叉树不一定是满二 叉树。 (2)在满二叉树的最下一层上,从最右边开始连续删去 若干结点后得到的二叉树仍然是一棵完全二叉树。 (3)在完全二叉树中,若某个结点没有左孩子,则它一 定没有右孩子,即该结点必是叶结点。
祖先(Ancestor)和子孙(Descendant) ①路径(path) 注意: 若一个结点序列是路径,则在树的树形图表示中, 该结点序列“自上而下”地通过路径上的每条边。 从树的根结点到树中其余结点均存在一条惟一的 路径 。 A B E K L F C G H M D I J
祖先(Ancestor)和子孙(Descendant) ②祖先(Ancestor)和子孙(Descendant) 若树中结点k到ks存在一条路径,则称k是ks的祖 祖 先(Ancestor),ks是k的子孙 子孙(Descendant)。 子孙 一个结点的祖先是从根结点到该结点路径上所经 过的所有结点,而一个结点的子孙则是以该结点为根 的子树中的所有结点。 约定: 结点k的祖先和子孙不包含结点k本身。

第六章树 作业讲解

第六章树 作业讲解

6-10 插入最右子结点
template<class T> int Tree<T> :: InsertChild(T value) { if(current = = NULL) return 0; if(current→firstChild == NULL) { current→firstChild=new TreeNode<T>(value,NULL,NULL); return 1 ;} else { TreeNode<T> *temp= current→firstChild; while(temp→nextBrother!=NULL) temp= temp→nextBrother; temp→nextBrother=new TreeNode<T>(value,NULL,NULL); return 1 ; }
6-13 后根遍历树——非递归算法
6-13 后根遍历树——递归算法
template<class T> void Tree<T> :: PostOrder() { if(! IsEmpty()) { TreeNode<T> *p = current ; // 保存当前结点 int k = FirstChild(); while(k)// 后根遍历当前结点的诸子树 { PostOrder(); k = NextBrother(); } current = p ; // 恢复当前指针 visit(); // 访问当前结点 } }
6-11 删除子结点
int k=1; while(temp→nextBrother!=NULL && k<i) { pred=temp; temp=temp→nextBrother; k++;} if(k = =i) { pred→nextBrother= temp→nextBrother; DelSubtree(temp); return 1;} else return 0; }

第六章 树基础知识)

第六章 树基础知识)

第六章树(基础知识)选择题部分1.在线索化二叉树中,t所指结点没有左子树的充要条件是()答案(A)t-〉left==NULL (B)t-〉ltag==1(C)t-〉ltag=1且t-〉left=NULL (D).以上都不对2.二叉树按某种顺序线索化后,任一结点均有指向其前趋和后继的线索,这种说法答案(A)正确(B)错误3.二叉树的前序遍历序列中,任意一个结点均处在其子女结点的前面,这种说法()答案(A)正确(B)错误4.由于二叉树中每个结点的度最大为2,所以二叉树是一种特殊的树,这种说法答案(A)正确(B)错误5.设高度为h的二叉树上只有度为0和度为2的结点,则此类二叉树中所包含的结点数至少为()。

答案(A)2h (B)2h-1(C)2h+1(D)h+16.已知某二叉树的后序遍历序列是dabec。

中序遍历序列是debac,它的前序遍历序列是()。

答案(A)acbed (B)decab(C)deabc (D)cedba7.如果T2是由有序树T转换而来的二叉树,那么T中结点的前序就是T2中结点的()答案(A)前序(B)中序(C)后序D.层次序8.某二叉树的前序遍历结点访问顺序是abdgcefh,中序遍历的结点访问顺序是dgbaechf,则其后序遍历的结点访问顺序是()。

答案(A)bdgcefha (B)gdbecfha (C)bdgaechf (D)gdbehfca9.二叉树为二叉排序树的充分必要条件是其任一结点的值均大于其左孩子的值、小于其右孩子的值。

这种说法()答案(A)正确(B)错误10.按照二叉树的定义,具有3个结点的二叉树有()种。

答案(A)3(B)4(C)5(D)611.在一非空二叉树的中序遍历序列中,根结点的右边()答案(A)只有右子树上的所有结点(B)只有右子树上的部分结点(C)只有左子树上的部分结点(D)只有左子树上的所有结点12.树最适合用来表示()。

答案(A)有序数据元素(B)无序数据元素(C)元素之间具有分支层次关系的数据(D)元素之间无联系的数据13.任何一棵二叉树的叶结点在先序、中序和后序遍历序列中的相对次序()答案(A)不发生改变(B)发生改变(C)不能确定D.以上都不对14.实现任意二叉树的后序遍历的非递归算法而不使用栈结构,最佳方案是二叉树采用()存储结构。

《数据结构——C语言描述》第6章:树

《数据结构——C语言描述》第6章:树
Void paintleaf (Btree root) { if (root!=NULL) { if (root ->Lchild==NULL && root ->Rchild==NULL) printf (root ->data); paintleaf (root ->Lchild); paintleaf (root -遍历左子树; (2)访问根结点; (3)中根遍历右子树。 后根遍历二叉树 (1)后根遍历左子树; (2)后根遍历右子树; (3)访问根结点。
先根遍历: -+a*b–cd/ef 中根遍历: a+b*c–d–e/f 后根遍历: abcd-*+ef/-
typedef struct Node { datatype data; struct Node *Lchild; struct Node *Rchild; } BTnode,*Btree;
满二叉树:一棵深度为k且有2k-1个结 点的二叉树称为满二叉树。 完全二叉树:深度为k,有n个结点的 二叉树当且仅当其每一个结点都与深度 为k的满二叉树中编号从1至n的结点一一 对应时,称为完全二叉树。
1 2 4 8 9 10 5 11 12 6 13 14 3 7 15 4 6 2
1 3 5 7
树的度:树中最大的结点的度数即为 树的度。图6.1中的树的度为3。 结点的层次(level):从根结点算起, 根为第一层,它的孩子为第二层……。 若某结点在第l层,则其孩子结点就在 第l+1层。图6.1中,结点A的层次为1, 结点M的层次为4。 树的高度(depth):树中结点的最大层 次数。图6.1中的树的高度为4。 森林(forest):m(m≥0)棵互不相交的 树的集合。

第六章-树和二叉树

第六章-树和二叉树


树 和 二 叉 树 13
1 2 3 A B C
4 5 6 7 0 D E F
8 0
9 10 0 G
¾ 二叉树顺序存储的算法描述
数 据 结 构
¾ 初始化二叉树

树 和 二 叉 树 14
#define Max_Size 100 typedef int TElemType; typedef TElemType SqBT[Max_Size+1]; void InitBT(SqBT bt){//设置空树 int i; for(i=1;i<=Max_Size;i++) bt[i]=0; }
数 据 结 构

树 和 二 叉 树 19
¾ 后序遍历顺序二叉树算法 void PostBT(SqBT bt,int i){ if(i>Max_Size||!bt[i]) return; PostBT(bt,2*i); PostBT(bt,2*i+1); printf("%3d ",bt[i]); }
数 据 结 构

树 和 二 叉 树 4
5. 孩子结点、双亲结点、兄弟结点、堂兄弟 结点、祖先结点、子孙结点…… 6. 结点的层次从根开始,根为第一层,根的 孩子为第二层;若某结点在第L层,则其 子树的根就在第L+1层。 7. 树的深度或高度:树中结点的最大层次。 8. 有序树:如果将树中结点的各子树看成是 从左至右有次序的;反之,则是无序树。 9. 森林:是m棵互不相交的树的集合。
数 据 结 构

树 和 二 叉 树 25
¾ 打印一维数组 void printSq(SqBT bt){ int i; printf("\nSeqArray:"); for(i=1;i<=Max_Size;i++) printf("%3d ",bt[i]); }

图论 第6章 树和割集

图论 第6章 树和割集
推论1 任一非平凡树中至少有两个度为1的顶点。 推论2 任一非平凡树都是偶图。 推论3 任一非平凡树都是2-色的。
1.3 极小连通图
定义2 若连通图G中去掉任一条边后得到一个不连通图,则称G 为极小连通图。 推论4 图G是树当且仅当G是极小连通图。
1.4 树的中心
定义3 设G=(V,E)是连通图,v∈V,数 e(v)=max{d(v,u)} 称为v在G中的偏心率。 数 r(G)=min{e(v)} 称为G的半径。 满足r(G)=e(v)的顶点v称为G的中心点。G的所有中心点组成 的集合称为G的中心,G的中心记为C(G)。 定理2 每棵树的中心或含有一个顶点,或含有两个邻接的顶点。
(2)∑deg v=2q
(3)根据具体的题设条件进行特殊的不等式的放缩[解题关键] 例3 设G是一棵树且Δ(G)≥k,证明:G中至少有k个1度顶点。
1.7 生成树(包含所有顶点的树)
定义1 设G=(V,E)是一个图,若G的一个生成子图 T=(V,F)是树,则称T是G的生成树。 定义2 设G=(V,E)是一个图,若G的一个生成子图 T=(V,F)是一个森林,则称T是G的生成森林。
1.8 生成树存在问题
定理1 图G有生成树的充分必要条件是G为一个连通图。
3极小连通图定义2若连通图g中去掉任一条边后得到一个不连通图则称g为极小连通图
第六章
树和割集
内容
树及其性质、生成树、割集
第一节
1.1 树和森林向树,简称树, 记为T。 定义2 无圈的无向图称为无向森林,简称森林。
1.2 树的特征性质
定理1 设G=(V,E)是一个(p,q)图,则下列命题等价: (1) G是树; (2) G的任两个不同顶点间有唯一的一条路联结; (3) G连通且 p=q+1; (4) G无圈且 p=q+1; (5) G无圈且任加一条边得到有唯一圈; (6) G连通且任去掉一条边得不连通图。

数据结构练习_第六章_树

数据结构练习_第六章_树

数据结构练习第六章树一、选择题1.树最适合用来表示( )。

A.有序数据元素B.无序数据元素C.元素之间具有分支层次关系的数据D.元素之间无联系的数据2.二叉树的第k层的结点数最多为( ).A.2k-1 B.2K+1 C.2K-1 D. 2k-13.设哈夫曼树中的叶子结点总数为m,若用二叉链表作为存储结构,则该哈夫曼树中总共有()个空指针域。

A. 2m-1B. 2mC. 2m+1D. 4m4.设某棵二叉树的中序遍历序列为ABCD,前序遍历序列为CABD,则后序遍历该二叉树得到序列为()。

A. BADCB. BCDAC. CDABD. CBDA5.设某棵二叉树中有2000个结点,则该二叉树的最小高度为()。

A. 9B. 10C. 11D. 126.设一棵二叉树的深度为k,则该二叉树中最多有()个结点。

A. 2k-1 B .2k C. 2k-1 D. 2k-17.设某二叉树中度数为0的结点数为N0,度数为1的结点数为Nl,度数为2的结点数为N2,则下列等式成立的是()。

A. N0=N1+1 B. N=Nl+N2C. N=N2+1 D. N=2N1+l8.设一棵m叉树中度数为0的结点数为N0,度数为1的结点数为Nl,……,度数为m的结点数为Nm,则N=()。

A. Nl +N2+……+Nm B. l+N2+2N3+3N4+……+(m-1)NmC. N2+2N3+3N4+……+(m-1)Nm D. 2Nl+3N2+……+(m+1)Nm9.设一组权值集合W={2,3,4,5,6},则由该权值集合构造的哈夫曼树中带权路径长度之和为()。

A. 20B. 30C. 40D. 4510.设二叉树的先序遍历序列和后序遍历序列正好相反,则该二叉树满足的条件是()。

A. 空或只有一个结点B. 高度等于其结点数C. 任一结点无左孩子D. 任一结点无右孩子11.设某棵三叉树中有40个结点,则该三叉树的最小高度为()。

A. 3B. 4C. 5D. 612.深度为k的完全二叉树中最少有()个结点。

数据结构第6章树习题

数据结构第6章树习题

第六章树习题1单项选择题1、若一棵二叉树具有10个度为2的结点,5个度为1的结点,则叶子结点个数是(B)。

A、9B、11C、15D、无法确定2、设给定权值总数有n个,其哈夫曼树的结点总数为( D )。

A、不确定B、2nC、2n+1D、2n–13、有关二叉树下列说法正确的是(B)。

A、二叉树的度为2B、一棵二叉树的度可以小于2C、二叉树中至少有一个结点的度为2D、二叉树中任何一个结点的度都为24、一棵二叉树高度为h,所有结点的度或为0,或为2,则这棵二叉树最少有( )结点。

A、2hB、2h-1C、2h+1D、h+15、对于有n个结点的二叉树, 其高度为()。

log D、不确定A、n log2nB、log2nC、⎣⎦n26、利用二叉链表存储树,则根结点的右指针是()。

A、指向最左孩子B、指向最右孩子C、空D、非空7、树的后根遍历序列等同于该树对应的二叉树的( )。

A、先序遍历B、中序遍历C、后序遍历D、层序遍历8、在下列存储形式中,哪一个不是树的存储形式?()A、双亲表示法B、孩子链表表示法C、孩子兄弟表示法D、顺序存储表示法9、已知一棵二叉树的前序遍历结果为ABCDEF,中序遍历结果为CBAEDF,则后序遍历的结果为()。

A、CBEFDAB、FEDCBAC、CBEDFAD、不定10、某二叉树的前序序列和后序序列正好相反,则该二叉树一定是()的二叉树。

A、空的或只有一个结点B、任一结点无左子树C、高度等于其结点数D、任一结点无右子树11、一棵左子树为空的二叉树在先序线索化后,其中空的链域的个数是:( )。

A、不确定B、0C、1D、212、若X是二叉中序线索树中一个有左孩子的结点,且X不为根,则x的前驱为( )。

A、X的双亲B、X的右子树中最左的结点C、X的左子树中最右结点D、X的左子树中最右叶结点13、引入二叉线索树的目的是().A、加快查找结点的前驱或后继的速度B、为了能在二叉树中方便的进行插入和删除C、为了能方便的找到双亲D、使二叉树的遍历结果唯一14、下述编码中哪一个不是前缀码()。

数据结构 第六章 树和二叉树

数据结构 第六章  树和二叉树

F
G
H
M
I
J
结点F,G为堂兄弟 结点A是结点F,G的祖先
5
树的基本操作
树的应用很广,应用不同基本操作也不同。下面列举了树的一些基本操作: 1)InitTree(&T); 2)DestroyTree(&T); 3)CreateTree(&T, definition); 4)ClearTree(&T); 5)TreeEmpty(T); 6)TreeDepth(T); 7) Root(T); 8) Value(T, &cur_e); 9) Assign(T, cur_e, value); 10)Paret(T, cur_e); 11)LeftChild(T, cur_e); 12)RightSibling(T, cur_e); 13)InsertChild(&T, &p, i, c); 14)DeleteChild(&T,&p, i); 15)TraverseTree(T, Visit( ));
1
2 4 8 9 10 5 11 12 6 13 14 3 7 15 4 6 2
1
3
5 7
证明:设二叉树中度为1的结点个数为n1 根据二叉树的定义可知,该二叉树的结点数n=n0+n1+n2
又因为在二叉树中,度为0的结点没有孩子,度为1的结点有1 个孩子,度为2的结点有2个结孩子,故该二叉树的孩子结点 数为 n0*0+n1*1+n2*2(分支数) 而一棵二叉树中,除根结点外所有都为孩子结点,故该二叉 树的结点数应为孩子结点数加1即:n=n0*0+n1*1+n2*2+1
文件夹1
文件夹n

第六章 树与二叉树

第六章 树与二叉树
44
森林的遍历
(4) 广度优先遍历(层次序 遍历) :
数据结构
若森林F为空,返回; 否则 依次遍历各棵树的根 结点; 依次遍历各棵树根结 点的所有子女; 依次遍历这些子女结 森林的二叉树表示 点的子女结点。
45
二叉树的计数 由二叉树的前序序列和中序序列可唯 一地确定一棵二叉树。例, 前序序列 { ABHFDECKG } 和中序序列 { HBDFAEKCG }, 构造二叉树过程如 下:
三个结点构成的不同的二叉树
8
用二 叉 树 表达实际问题
例2 双人比赛的所有可能的结局
开始

开局连赢两局 或五局三胜


甲 甲 乙

乙 甲 乙 甲 甲 乙

乙 甲



乙甲


乙 甲 乙
二叉树的性质
数据结构
性质1 若二叉树的层次从1开始, 则在二叉树的 第 i 层最多有 2i -1个结点。(i 1) [证明用数学归纳法] 性质2 高度为k的二叉树最多有 2k-1个结点。 (k 0) [证明用求等比级数前k项和的公式]
前序遍历二叉树算法的框架是 若二叉树为空,则空操作; 否则 – 访问根结点 (V); – 前序遍历左子树 (L); – 前序遍历右子树 (R)。
遍历结果 -+a*b-cd/ef
27
数据结构
后序遍历 (Postorder Traversal)
后序遍历二叉树算法的框架是 若二叉树为空,则空操作; 否则 – 后序遍历左子树 (L); – 后序遍历右子树 (R); – 访问根结点 (V)。
数据结构
36
左子女-右兄弟表示法 第一种解决方案

数据结构 第六章-树

数据结构 第六章-树

20
A B C D
E
F
G H
I J
A
E F H
G
B C
D A
I J
A
B C F
E H
G
B C D F
E G H I J
21
I
D
J
5. 二叉树转换成树和森林
二叉树转换成树 1. 加线:若p结点是双亲结点的左孩子,则将p的右孩 子,右孩子的右孩子,……沿分支找到的所有右孩 子,都与p的双亲用线连起来 2. 抹线:抹掉原二叉树中双亲与右孩子之间的连线 3. 调整:将结点按层次排列,形成树结构7Fra bibliotek6.3.2
树和森林的存储结构
树的存储结构有很多,既可以采用顺序存储结构, 也可以采用链式存储结构。但无论采用哪种存储方式, 都要求存储结构不仅能存储各结点本身的数据信息,还 要能惟一地反映树中各结点之间的逻辑关系。 双亲表示法 孩子链表表示法 孩子兄弟表示法
8
1.双亲表示法 除根外,树中的每个结点都有惟一的一个双亲结点,所以可以用一 组连续的存储空间存储树中的各结点。一个元素表示树中一个结点, 包含树结点本身的信息及结点的双亲结点的位臵。 A B E F C G H D I
}CTBox;
//树结构 typedef struct {CTBox nodes[MAX_TREE_SIZE]; int n, r; }Ctree
12
3. 孩子-兄弟表示法(树的二叉链表)
孩子兄弟表示法用二叉链表作为树的存储结构。将树中的多支关系用 二叉链表的双支关系体现。 ※ 结点的左指针指向它的第一个孩子结点
//孩子结点结构 typedef struct CTNode
1 2 3 4 5 6

第6章-1( 树的基本概念)

第6章-1( 树的基本概念)

10.层数 根结点的层数为1,其它结点的层数为从根结点到该 结点所经过的分支数目再加1。 11. 树的高度(深度) 树中结点所处的最大层数称为树的高度,如空树的 高度为0,只有一个根结点的树高度为1。 12.树的度 树中结点度的最大值称为树的度。
13. 有序树
若一棵树中所有子树从左到右的排序是有顺序的,不 能颠倒次序。称该树为有序树。 14. 无序树
性质3 对任意一棵二叉树,如果叶子结点个数为n0, 度为2的结点个数为n2,则有n0=n2+1。 证明:设二叉树中度为1的结点个数为n1,根据二叉树 的定义可知,该二叉树的结点数n=n0+n1+n2。又因为 在二叉树中,度为0的结点没有孩子,度为1的结点有1 个孩子,度为2的结点有2个结孩子,故该二叉树的孩 子结点数为 n0*0+n1*1+n2*2 ,而一棵二叉树中,除根 结点外所有都为孩子 结点,故该二叉树的结点数应为 孩子结点数加1即:n=n0*0+n1*1+n2*2+1因此,有 n=n0+n1+n2=n0*0+n2*1+n2*2+1,最后得到n0=n2+1。 先定义两种特殊的二叉树:
初始化树T。 (2) root(T) 求树T的根结点。
(3) parent(T,x)
求树T中,值为x的结点的双亲。 (4) child(T,x,i)
求树T中,值为x的结点的第i个孩子。
(5) addchild(y,i,x) 把值为x的结点作为值为y的结点的第i个孩子插入到树 中。 (6) delchild(x,i)
图 6-1 树的示意图
2. 凹入法表示法
具体参见图6-3 。
A B E J K L F C G D H M I 图 6-3 图 6-1(c)的树的凹入法表示
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第6章树和二叉树一、基础知识题6.1设树T的度为4,其中度为1,2,3和4的结点个数分别为4,2,1,1,求树T中的叶子数。

【解答】设度为m的树中度为0,1,2,…,m的结点数分别为n0, n1, n2,…, n m,结点总数为n,分枝数为B,则下面二式成立n= n0+n1+n2+…+n m(1)n=B+1= n1+2n2+…+mn m+1 (2)由(1)和(2)得叶子结点数n0=1+即:n0=1+(1-1)*4+(2-1)*2+(3-1)*1+(4-1)*1=86.2一棵完全二叉树上有1001个结点,求叶子结点的个数。

【解答】因为在任意二叉树中度为2 的结点数n2和叶子结点数n0有如下关系:n2=n0-1,所以设二叉树的结点数为n, 度为1的结点数为n1,则n= n0+ n1+ n2n=2n0+n1-11002=2n0+n1由于在完全二叉树中,度为1的结点数n1至多为1,叶子数n0是整数。

本题中度为1的结点数n1只能是0,故叶子结点的个数n0为501.6.3 一棵124个叶结点的完全二叉树,最多有多少个结点。

【解答】由公式n=2n0+n1-1,当n1为1时,结点数达到最多247个。

6.4.一棵完全二叉树有500个结点,请问该完全二叉树有多少个叶子结点?有多少个度为1的结点?有多少个度为2的结点?如果完全二叉树有501个结点,结果如何?请写出推导过程。

【解答】由公式n=2n0+n1-1,带入具体数得,500=2n0+n1-1,叶子数是整数,度为1的结点数只能为1,故叶子数为250.度为2的结点数是249.若完全二叉树有501个结点,则叶子数251,度为2的结点数是250,度为1的结点数为0.6.5 某二叉树有20个叶子结点,有30个结点仅有一个孩子,则该二叉树的总结点数是多少。

【解答】由公式n=2n0+n1-1,得该二叉树的总结点数是69。

6.6 求一棵具有1025个结点的二叉树的高h。

【解答】该二叉树最高为1025(单支树),最低为完全二叉树高11。

6.7 一棵二叉树高度为h,所有结点的度或为0,或为2,则这棵二叉树最少有多少结点。

【解答】第一层只一个根结点,其余各层都两个结点,这棵二叉树最少结点数是2h-1。

6.8将有关二叉树的概念推广到三叉树,则一棵有244个结点的完全三叉树的高度是多少。

【解答】设含n个结点的完全三叉树的高度为h,则有<n≤<n≤<2n<本题n=244, h=66.9 对二叉树的结点从1开始进行连续编号,要求每个结点的编号大于其左、右孩子的编号,同一结点的左、右孩子中,其左孩子的编号小于其右孩子的编号,是采用何种次序的遍历实现编号的。

【解答】后序遍历二叉树。

6.10 高度为h(h>0)的满二叉树对应的森林由多少棵树构成。

【解答】h棵树。

根结点,根结点的右子女,右子女的右子女,……,都是树的根。

6.11 某二叉树结点的中序序列为BDAECF,后序序列为DBEFCA,则该二叉树对应的森林包括几棵树?【解答】3棵树。

(只需画出右子树就可求解)6.12 对任意一棵树,设它有n个结点,这n个结点的度数之和为多少?【解答】n-1。

度数其实就是分支个数。

根结点无分支所指,其余结点有且只有一个分支所指。

6.13 一棵左子树为空的二叉树在先序线索化后,其中空的链域的个数是多少?【解答】2个。

6.14 一棵左、右子树均不空的二叉树在先序线索化后,其中空的链域的个数是多少?【解答】1个。

6.15 设B是由森林F变换得的二叉树。

若F中有n个非终端结点,则B中右指针域为空的结点有几个?【解答】n+1个。

6.16 试分别找出满足以下条件的所有二叉树:(1) 二叉树的前序序列与中序序列相同;(2) 二叉树的中序序列与后序序列相同;(3) 二叉树的前序序列与后序序列相同;(4) 二叉树的前序序列与层次序列相同;(5) 二叉树的前序、中序与后序序列均相同。

【解答】前序遍历二叉树的顺序是“根—左子树—右子树”,中序遍历的顺序是“左子树—根—右子树”,后序遍历顺序是:“左子树—右子树―根",根据以上原则,本题解答如下:若前序序列与中序序列相同,则或为空树,或为任一结点至多只有右子树的二叉树。

若中序序列与后序序列相同,则或为空树,或为任一结点至多只有左子树的二叉树。

若前序序列与后序序列相同,则或为空树,或为只有根结点的二叉树。

若二叉树的前序、中序与后序序列均相同,则或为空树,或为只有根结点的二叉树。

6.17 已知一棵二叉树的前序遍历的结果是ABECDFGHIJ,中序遍历的结果是EBCDAFHIGJ,试画出这棵二叉树,对二叉树进行中序线索化,并将该二叉树转换为森林。

BAJCEDGFHInullnull【解答】6.18 已知一棵二叉树的后序遍历序列为EICBGAHDF,同时知道该二叉树的中序遍历序列为CEIFGBADH,试画出该二叉树。

FECIABGDH【解答】6.19设二叉树中每个结点均用一个字母表示,若一个结点的左子树或右子树为空,用#表示,现前序遍历二叉树,访问的结点序列为ABD##C#E##F##,写出中序和后序遍历二叉树时结点的访问序列。

【解答】中序遍历二叉树时结点的访问序列:#D#B#C#E#A#F#后序遍历二叉树时结点的访问序列。

##D###ECB##FA6.20有n个结点的k叉树(k≥2)用k叉链表表示时,有多少个空指针?【解答】k叉树(k≥2)用k叉链表表示时,每个结点有k个指针,除根结点没有指针指向外,其余每个结点都有一个指针指向,故空指针的个数为:nk-(n-1)=n(k-1)+16.21 一棵高度为h的满k叉树有如下性质:根结点所在层次为0;第h层上的结点都是叶子结点;其余各层上每个结点都有k棵非空子树,如果按层次自顶向下,同一层自左向右,顺序从1开始对全部结点进行编号,试问:(1)各层的结点个数是多少?(2)编号为i的结点的双亲结点(若存在)的编号是多少?(3)编号为i的结点的第m个孩子结点(若存在)的编号是多少?(4)编号为i的结点有右兄弟的条件是什么?其右兄弟结点的编号是多少?【解答】(1)k l(l为层数,按题意,根结点为0层)(2)因为该树每层上均有k l个结点,从根开始编号为1,则结点i的从右向左数第2个孩子的结点编号为ki。

设n 为结点i的子女,则关系式(i-1)k+2<=n<=ik+1成立,因i是整数,故结点i的双亲的编号为⎣(i-2)/k⎦+1。

(3) 结点i(i>1)的前一结点编号为i-1(其最右边子女编号是(i-1)*k+1),故结点 i的第 m个孩子的编号是(i-1)*k+1+m。

(4) 根据以上分析,结点i有右兄弟的条件是,它不是双亲的从右数的第一子女,即 (i-1)%k!=0,其右兄弟编号是i+1。

6.22.证明任一结点个数为n(n>0) 的二叉树的高度至少为⎣(logn)⎦+1。

【解答】最低高度二叉树的特点是,除最下层结点个数不满外,其余各层的结点数都应达到各层的最大值。

设n个结点的二叉树的最低高度是h,则n应满足2h-1≦n≦2h-1关系式。

解此不等式,并考虑h是整数,则有h=⎣logn⎦+1,即任一结点个数为n 的二叉树的高度至少为O(logn)。

6.23 已知A[1..N]是一棵顺序存储的完全二叉树,如何求出A[i]和A[j]的最近的共同祖先?【解答】根据顺序存储的完全二叉树的性质,编号为i的结点的双亲的编号是⎣i/2⎦,故A[i]和A[j]的最近公共祖先可如下求出:while(i/2!=j/2)if(i>j) i=i/2;else j=j/2;退出while后,若i/2=0,则最近公共祖先为根结点,否则最近公共祖先是i/2。

6.24已知一棵满二叉树的结点个数为20到40之间的素数,此二叉树的叶子结点有多少个?【解答】结点个数在20到40的满二叉树且结点数是素数的数是31,其叶子数是16。

6.25求含有n个结点、采用顺序存储结构的完全二叉树中的序号最小的叶子结点的下标。

要求写出简要步骤。

【解答】根据完全二叉树的性质,最后一个结点(编号为n)的双亲结点的编号是⎣n/2⎦,这是最后一个分枝结点,在它之后是第一个终端(叶子)结点,故序号最小的叶子结点的下标是⎣n/2⎦+1。

6.26 试证明:同一棵二叉树的所有叶子结点,在前序序列。

中序序列以及后序序列中都按相同的相对位置出现(即先后顺序相同),例如前序abc,后序bca,中序bac。

【证明】前序遍历是“根-左-右”,中序遍历是“左-根-右”,后序遍历是“左-右-根”。

三种遍历中只是访问“根”结点的时机不同,对左右子树均是按左右顺序来遍历的,因此所有叶子都按相同的相对位置出现。

6.27设具有四个结点的二叉树的前序遍历序列为abcd;S为长度等于4的由a,b,c,d排列构成的字符序列,若任取S作为上述算法的中序遍历序列,试问是否一定能构造出相应的二叉树,为什么?试列出具有四个结点二叉树的全部形态及相应的中序遍历序列。

【解答】若前序序列是abcd,并非由这四个字母的任意组合(4!=24)都能构造出二叉树。

因为以abcd为输入序列,通过栈只能得到1/(n+1)*2n!/(n!*n!)=14 种,即以abcd为前序序列的二叉树的数目是14。

任取以abcd作为中序遍历序列,并不全能与前序的abcd序列构成二叉树。

例如:若取中序序列dcab就不能。

该14棵二叉树的形态及中序序列略。

6.28已知某二叉树的每个结点,要么其左、右子树皆为空,要么其左、右子树皆不空。

又知该二叉树的前序序列为:J、F、D、B、A、C、E、H、X、I、K;后序序列为:A、C、B、E、D、X、I、H、F、K、J。

请给出该二叉树的中序序列(即中根次序),并画出相应的二叉树树形。

【解答】二叉树中序序列ABCDEFXHIJK,相应的二叉树树形略。

6.29 已知一个森林的先序序列和后序序列如下,请构造出该森林。

先序序列:ABCDEFGHIJKLMNO后序序列:CDEBFHIJGAMLONK【解答】森林的先序序列和后序序列对应其转换的二叉树的先序序列和中序序列,应先据此构造二叉树,再构造出森林。

FAEBDCJHGIKONLMG6.30 画出同时满足下列两条件的两棵不同的二叉树。

(1)按先根序遍历二叉树顺序为ABCDE。

(2)高度为5其对应的树(森林)的高度最大为4。

【解答】ABDCEABCDE6.31用一维数组存放的一棵完全二叉树;ABCDEFGHIJKL。

请写出后序遍历该二叉树的结点访问序列。

ABCEDGIHFJK【解答】6.33设树形T在后根次序下的结点排列和各结点相应的度数如下:后根次序:BDEFCGJKILHA次数:000030002024请画出T的树形结构图。

相关文档
最新文档