二叉树.docx
- 文档编号:26718270
- 上传时间:2023-06-22
- 格式:DOCX
- 页数:19
- 大小:252.30KB
二叉树.docx
《二叉树.docx》由会员分享,可在线阅读,更多相关《二叉树.docx(19页珍藏版)》请在冰豆网上搜索。
二叉树
第六章树
第一部分:
知识点
知识脉络:
重点:
二叉树的性质、:
I树的各种遍历方法及它g1所确定的序列问的关系、二又树上的基本运算算法
的实现、二又树的线索化方法,构造赂夫曼树的方法。
难点:
二叉树上各种算法,特别是遍历的非递归算法的设计。
一、二叉树的遍历的非递归算法
1.先序遍历
先将根结点入栈,然后只要栈不空,先出栈,然后沿着左子针依次访问沿途经过的子树根结点,同时将右指针进栈(以便递归访问左子树后访问右子树),如此重复,直至栈为空。
voidPreOrderBiTree(BitTreeT)
{SqStackS;
BitTreep;
InitStack(&S);/*初始化一个空栈*/
Push(&S,T);/*根结点指针进栈*/
while(!
EmptyStack(S))/*栈为空时算法结束*/
{Pop(S,&p);/*弹栈,p指向(子树)根结点*/
while(p)
{printf("%d",p->data);/*访问根结点*/
if(p->rchild)Push(S,p->rchild);/*非空的右指针进栈*/
p=p->lchild;/*沿着左指针访问,直到左指针为空*/
}
}
}
2.中序遍历
先沿着左指针走到最左下的结点同时将沿途经过的(子树)根结点指针进栈。
当走到空指针时,出栈得到一个结点并访问,然后跳到右子树上。
如此重复,直到指针为空并且栈为空为止。
voidInOrderBitree(BitTreeT)
{SqStackS;
BitTreep;
InitStack(&S);/*初始化一个栈*/
p=T;/*p指向根结点*/
while(p||!
EmptyStack(S))/*当p为空且栈为空时算法结束*/
{while(p)
{Push(S,p);
p=p->lchild;/*沿左指针走,沿途经过的(子树)根结点指针进栈*/
}
Pop(S,&p);
printf("%d",p->data);/*当左指针为空时弹栈并访问该结点(子树根结点)*/
p=p->rchild;/*向右跳一步到右子树上继续进行遍历过程*/
}
}
3.后序遍历
voidPostOrderBiTree(BitTreeT)
{SqStackS;
BitTreep,q;
InitStack(S);
p=T;q=NULL;
while(p||!
EmptyStack(S))
{if(p!
=q)
{while(p)
{Push(S,p);
if(p->lchild)p=p->lchild;
elsep=p->rchild;
}
}
if(S->top==S->base)break;
GetTop(S,&q);
if(q->rchild==p)
{p=Pop(S);
printf("%d",p->data);
}
elsep=q->rchild;
}
}
二、线索二叉树
1、已知树T如下,画出它的三种线索二叉树
先序线索二叉树
(1)写出先序序列:
ABDCEFG
(2)为度不是2结点添加指针。
若没有左孩子,添加左孩子指针并
指向直接前驱。
若没有右孩子,添加右孩子指针
并指向直接后继。
中序线索二叉树后序线索二叉树
中序序列:
DBAFEGC写出后序序列:
DBFGECA
2、中序线索二叉树的存储结构
带头结点的中序线索化树
以中序线索链表为存储结构的中序遍历
inorderthread1(BiThrTreeThrt)
{
BiThrTreep=Thrt->lchild;
while(p!
=Thrt)
{while(p->ltag==0)p=p->lchild;
printf("%d",p->data);
while(p->rtag==1&&p->rchild!
=Thrt)
{p=p->rchild;printf("%d",p->data);}
p=p->rchild;
}
}
第二部分:
习题
一、选择题
1.已知一算术表达式的中缀形式为A+B*C-D/E,后缀形式为ABC*+DE/-,其前缀形式为()
A.-A+B*C/DEB.-A+B*CD/EC.-+*ABC/DED.-+A*BC/DE
E
F
D
G
A
B
/
+
+
*
-
C
*
2.设有一表示算术表达式的二叉树(见右图),
它所表示的算术表达式是()。
A.A*B+C/(D*E)+(F-G)B.(A*B+C)/(D*E)+(F-G)
C.(A*B+C)/(D*E+(F-G))D.A*B+C/D*E+F-G
3.算术表达式a+b*(c+d/e)的逆波兰式为()
A.ab+cde/*B.abcde/+*+C.abcde/*++D.abcde*/++
4.在下述结论中,正确的是()。
①只有一个结点的二叉树的度为0;②二叉树的度为2;③二叉树的左右子树可任意交换;
④深度为K的完全二叉树的结点个数小于或等于深度相同的满二叉树。
A.①②③B.②③④C.②④D.①④
5.若一棵二叉树具有10个度为2的结点,5个度为1的结点,则度为0的结点个数是()
A.9B.11C.15D.不确定
6.一棵完全二叉树上有1001个结点,其中叶子结点的个数是()。
A.250B.500C.254D.505E.以上答案都不对
7.设树T的度为4,其中度为1,2,3和4的结点个数分别为4,2,1,1则T中的叶子数为()
A.5B.6C.7D.8
8.设森林F对应的二叉树为B,它有m个结点,B的根为p,p的右子树结点个数为n,森林F中第一棵树的结点个数是()
A.m-nB.m-n-1C.n+1D.条件不足,无法确定
9.设森林F中有三棵树,第一,第二,第三棵树的结点个数分别为M1,M2和M3。
与森林F对应的二叉树根结点的右子树上的结点个数是()。
A.M1B.M1+M2C.M3D.M2+M3
10.一棵二叉树高度为h,所有结点的度或为0,或为2,则这棵二叉树最少有()结点
A.2hB.2h-1C.2h+1D.h+1
11.深度为h的满m叉树的第k层有()个结点。
(1= A.mk-1B.mk-1C.mh-1D.mh-1 12.将有关二叉树的概念推广到三叉树,则一棵有244个结点的完全三叉树的高度() A.4B.5C.6D.7 13.利用二叉链表存储树,则根结点的右指针是()。 A.指向最左孩子B.指向最右孩子C.空D.非空 14.树的后根遍历序列等同于该树对应的二叉树的(). A.先序序列B.中序序列C.后序序列 15.若二叉树采用二叉链表存储结构,要交换其所有分支结点左、右子树的位置,利用()遍历方法最合适。 A.前序B.中序C.后序D.按层次 16.在下列存储形式中,哪一个不是树的存储形式? ()。 A.双亲表示法B.孩子链表表示法C.孩子兄弟表示法D.顺序存储表示法 17.某二叉树中序序列为A,B,C,D,E,F,G,后序序列为B,D,C,A,F,G,E则前序序列是: () A.E,G,F,A,C,D,BB.E,A,C,B,D,G,FC.E,A,G,C,F,B,DD.上面的都不对 18.上题的二叉树对应的森林包括多少棵树()。 A.lB.2C.3D.概念上是错误的 19.一棵非空的二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树一定满足() A.所有的结点均无左孩子B.所有的结点均无右孩子 C.只有一个叶子结点D.是任意一棵二叉树 20.在二叉树结点的先序序列,中序序列和后序序列中,所有叶子结点的先后顺序() A.都不相同 B.完全相同C.先序和中序相同,而与后序不同 D.中序和后序相同,而与先序不同 21.一棵左子树为空的二叉树在先序线索化后,其中空的链域的个数是: () A.不确定B.0C.1D.2 22.一棵左右子树均不空的二叉树在先序线索化后,其中空的链域的个数是: ()。 A.0B.1C.2D.不确定 23.若X是二叉中序线索树中一个有左孩子的结点,且X不为根,则x的前驱为() A.X的双亲B.X的右子树中最左的结点C.X的左子树中最右结点D.X的左子树中最右叶结点 24.引入二叉线索树的目的是() A.加快查找结点的前驱或后继的速度B.为了能在二叉树中方便的进行插入与删除 C.为了能方便的找到双亲D.使二叉树的遍历结果唯一 25.线索二叉树是一种()结构。 A.逻辑B.逻辑和存储C.物理D.线性 26.n个结点的线索二叉树上含有的线索数为() A.2nB.n-lC.n+lD.n 27.二叉树在线索后,仍不能有效求解的问题是()。 A.前(先)序线索二叉树中求前(先)序后继B.中序线索二叉树中求中序后继 C.中序线索二叉树中求中序前驱D.后序线索二叉树中求后序后继 28.如果T2是由有序树T转换而来的二叉树,那么T中结点的后序就是T2中结点的()。 A.先序B.中序C.后序D.层次序 29.设给定权值总数有n个,其哈夫曼树的结点总数为()。 A.不确定B.2nC.2n+1D.2n-1 30.下述编码中哪一个不是前缀码()。 A.(00,01,10,11)B.(0,1,00,11) C.(0,10,110,111)D.(1,01,000,001) 二、填空题 1.在完全二叉树中,编号为i和j的两个结点处于同一层的条件是______。 2.一棵有n个结点的满二叉树有__ (1)_个度为1的结点、有__ (2)_个分支(非终端)结点和__(3)_个叶子,该满二叉树的深度为_(4)__。 3.高度为K的完全二叉树至少有______个叶子结点。 4.已知二叉树有50个叶子结点,则该二叉树的总结点数至少是______。 5.设F是由T1,T2,T3三棵树组成的森林,与F对应的二叉树为B,已知T1,T2,T3的结点数分别为n1,n2和n3则二叉树B的左子树中有__ (1)_个结点,右子树中有_ (2)__个结点。 6.如某二叉树有20个叶子结点,有30个结点仅有一个孩子,则该二叉树的总结点数为______。 7.对于一个具有n个结点的二元树,当它为一棵_ (1)_二元树时具有最小高度,当它为一棵_ (2)_时,具有最大高度。 8.具有N个结点的二叉树,采用二叉链表存储,共有______个空链域。 9.每一棵树都能唯一的转换为它所对应的二叉树。 若已知一棵二叉树的前序序列是BEFCGDH,对称序列是FEBGCHD,则它的后序序列是_ (1)__。 设上述二叉树是由某棵树转换而成,则该树的先根次序序列是_ (2)__。 10.二叉树的先序序列和中序序列相同的条件是______。 11.线索二元树的左线索指向其______,右线索指向其______。 12.若以{4,5,6,7,8}作为叶子结点的权值构造哈夫曼树,则其带权路径长度是______。 13.下列是先序遍历二叉树的非递归子程序,请阅读子程序(C语言与PASCAL语言过程功能完全相同,任选其一),填充空格,使其成为完整的算法。 voidexample(b) btree*b; {btree*stack[20],*p; inttop; if(b! =null) {top=1;stack[top]=b; while(top>0) {p=stack[top];top--; printf(“%d”,p->data); if(p->rchild! =null) { (1)___; (2)___; } if(p->lchild! =null) (3)___; (4)__; } } } 14.以下程序是二叉链表树中序遍历的非递归算法,请填空使之完善。 二叉树链表的结点类型的定义如下: typedefstructnode/*C语言/ {chardata;structnode*lchild,*rchild;}*bitree; voidvst(bitreebt)/*bt为根结点的指针*/ {bitreep;p=bt;initstack(s);/*初始化栈s为空栈*/ while(p||! empty(s))/*栈s不为空*/ if(p){push(s,p); (1)___;}/*P入栈*/ else{p=pop(s);printf(“%c”,p->data); (2)____; }/*栈顶元素出栈*/ } 15.由二叉树的前序遍历和中序遍历序列能确定唯一的一棵二叉树,下面程序的作用是实现由已知某二叉树的前序遍历和中序遍历序列,生成一棵用二叉链表表示的二叉树并打印出后序遍历序列,请写出程序所缺的语句。 #defineMAX100 typedefstructNode {charinfo;structNode*llink,*rlink;}TNODE; charpred[MAX],inod[MAX]; main(intargc,int**argv) {TNODE*root; if(argc<3)exit0; strcpy(pred,argv[1]);strcpy(inod,argv[2]); root=restore(pred,inod,strlen(pred)); postorder(root); } TNODE*restore(char*ppos,char*ipos,intn) {TNODE*ptr;char*rpos;intk; if(n<=0)returnNULL; ptr->info= (1)_______; for( (2)_______;rpos k=(3)_______; ptr->llink=restore(ppos+1,(4)_______,k); ptr->rlink=restore((5)_______+k,rpos+1,n-1-k); returnptr; } postorder(TNODE*ptr) {if(ptr=NULL)return; postorder(ptr->llink);postorder(ptr->rlink);printf(“%c”,ptr->info); } 16、下面是中序线索树的遍历算法,树有头结点且由指针thr指向。 树的结点有五个域,分别为数据域data,左、右孩子域lchild、rchild和左、右标志域ltag,rtag。 规定,标志域为1是线索,O是指向孩子的指针。 inordethread(thr) {p=thr->lchild; while( (1)______) {while( (2)_____)p=(3)___; printf(p->data); while((4)_________){p=(5)___;printf(p->data);} p=(6)_; } } 17、线索二叉树有数据域data,左右孩子域lchild和rchild,左右标志ltag及rtag,规定标志为1对应的孩子域是线索,0则为指向孩子的指针。 规定在储存线索二叉树时,完成下面中序线索化过程。 (存储线索二叉树,不增加头结点,只在原有的由tree指向的二叉树中增加线索,此处也不考虑c语言的具体语法与约定,线索化前所有的标志tag都是0)。 /*pre是同tree类型相同的指针,初值是null*/ thread_inorder(tree) {if(tree! =null) {thread_inorder( (1)____); if(tree->lchild== (2)______){tree->ltag=1;tree->lchild=pre;} if((3)___==null){(4)_______;(5)_______;} pre=p;thread-inorder((6)_______); } } 18、如下的算法分别是后序线索二叉树求给定结点node的前驱结点与后继结点的算法,请在算法空格处填上正确的语句。 设线索二叉树的结点数据结构为(lflag,left,data,right,rflag),其中: lflag=0,left指向其左孩子,lflag=1,left指向其前驱;rflag=0,right指向其右孩子,rflag=1,right指向其后继。 prior(node,x) {if(node! =null) if( (1)_____)*x=node->right;else*x=node->left; } next(bt,node,x)/*bt是二叉树的树根*/ { (2)_____; if(node! =bt&&node! =null) if(node->rflag)(3)_______; else{dot=*x;(4)_______;while(*x==node);*x=t;} } 三、应用题 1、从概念上讲,树,森林和二叉树是三种不同的数据结构,将树,森林转化为二叉树的基本目的是什么,并指出树和二叉树的主要区别。 2、一个深度为L的满K叉树有以下性质: 第L层上的结点都是叶子结点,其余各层上每个结点都有K棵非空子树,如果按层次顺序从1开始对全部结点进行编号,求: 1)各层的结点的数目是多少? 2)编号为n的结点的双亲结点(若存在)的编号是多少? 3)编号为n的结点的第i个孩子结点(若存在)的编号是多少? 4)编号为n的结点有右兄弟的条件是什么? 如果有,其右兄弟的编号是多少? 请给出计算和推导过程。 、 3、已知A[1..N]是一棵顺序存储的完全二叉树,如何求出A[i]和A[j]的最近的共同祖先? 4、若一棵树中有度数为1至m的各种结点数为n1,n2,…,nm(nm表示度数为m的结点个数)请推导出该树中共有多少个叶子结点n0的公式。 5、试证明,在具有n(n>=1)个结点的m次树中,有n(m-1)+1个指针是空的。 6、①试找出满足下列条件的二叉树 1)先序序列与后序序列相同2)中序序列与后序序列相同 3)先序序列与中序序列相同4)中序序列与层次遍历序列相同 ②已知一棵二叉树的中序序列和后序序列分别为DBEAFIHCG和DEBHIFGCA,画出这棵二叉树。 7、将下列由三棵树组成的森林转换为二叉树。 (只要求给出转换结果) N P G H J M O L I K E D F B A C 8、设一棵二叉树的先序、中序遍历序列分别为 先序遍历序列: ABDFCEGH中序遍历序列: BFDAGEHC
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二叉