习题5 树和二叉树
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(3) 设计算法求二叉树的深度.
解法二:用后序遍历的非递归算法,这是栈的最大顶就是此 树的深度。 void BiTree::DepthPostOrder(BiNode<T> *rt) { depth=0; top= -1; //采用顺序栈,并假定栈不会发生上溢 while (rt!=NULL | | top!= -1) { while (rt!=NULL) { s[++top].ptr=rt; s[top].flag=1; rt=rt->lchild; } if(top>=depth) depth=top+1; while (top!= -1 && s[top].flag==2) { rt=s[top--].ptr; } if (top!= -1) { s[top].flag=2; rt=s[top].ptr->rchild; } } cout<<"The depth of the tree is "<< depth; }
(6) 以二叉链表为存储结构,在二叉树中删除以值x为根结点 的子树. void BiTree::DeleteX(BiNode<T> *rt, T x) { if(rt==NULL) return; if(rt->data==x) {Release(rt);} else{ DeleteX(rt->lchild, x); DeleteX(rt->rchild, x); } }
4. 解答下列问题
(1) 证明:任何满二叉树的分支数B=2(n0-1). (2) 证明:已知一棵二叉树的前序序列和中序序列, 则可唯一确定该二叉树。 (3) 已知一棵度为m的树中:n1个度为1的结点,n2个度 为2的结点,„,nm个度为m的结点,问该树中共有多 少个叶子结点?
(4) 已知一棵二叉树的中序和后序序列为 CBEDAFIGH和CEDBIFHGA,试构造该二叉树。
(3) 设计算法求二叉树的深度.
解法三:用层序遍历算法, 设一个指针来表示目前遍历到 的层数,最底层就是此树的深度。 void BiTree::Depth(BiNode<T> *rt) { int depth=0, flag=0;//depth为树的深度,flag为当前遍历到的层数 front=rear=-1; //采用顺序队列,并假定不会发生上溢 if (rt!=NULL) { Q[++rear]=rt; // Q为队列 while (front!=rear) { q=Q[++front]; if (q->lchild!=NULL) Q[++rear]=q->lchild; if (q->rchild!=NULL) Q[++rear]=q->rchild; if(front==flag) {depth++; flag=rear;} }} cout<<depth; }
2 选择题
(1) 如果结点A有3个兄弟,B是A的双亲,则B的度是( A.1 B.2 C.3 D.4 D )。
(2) 设二叉树有n个结点,则其深度为( D )。 A.n一1 B.n C. log2 n 1 D.不能定
(3) 二叉树的前序序列和后序序列正好相反,则该二叉树一 定是( B )的二叉树。 A.空或只有一个结点 B.高度等于其结点数 C.任一结点无左孩子 D.任一结点无右孩子
1 填空题(续) (5)深度为k的二叉树中,所含叶子的个数最多为(2k-1). (6)具有100个结点的完全二叉树的叶子结点数为(50)。 (7) 已知一棵度为3的树有2个度为1的结点,3个度为2 的结点,4个度为3的结点。则该树有(12)个叶子结点。 (8) 某二叉树的前序遍历序列是ABCDEFG,中序遍历序 列是CBDAFGE,则其后序遍历序列是( CDBGFEA )。 (9)在具有n个结点的二叉链表中,共有( 2n )个指 针域,其中( n-1 )个指针域用于指向其左右孩子, 剩下的( n+1 )个指针域则是空的。 (10)在有n个叶子的哈夫曼树中,叶子结点总数为(n), 分支结点总数为( n-1 )。
wk.baidu.com
(4) 线索二叉树中某结点R没有左孩子的充要条件是( C )。 A. R.child=NULL B. R.ltag=0 C. R.ltag=1 D. R.child=NULL
(5) 深度为k的完全二叉树至少有( B )个结点,至多有( C ) 个结点。 A.2k-2+1 B.2k-1 C.2k-1 D.2k-1-1 (6) 一个高度为h的满二叉树共有n个结点,其中有m个叶子结 点,则有( D )成立。 A.n=h+m B.h+m=2n C.m=h-1 D.n=2m一1
(3) 设计算法求二叉树的深度.
解法四:用前序遍历算法, 在栈中设两个域,一个表示原遍历结点,一个 表示此结点的层数。 template <class T> void BiTree::DepthProOrder(BiNode<T> *rt) { top= -1; length=0; //采用顺序栈s,并假定不会发生上溢 while (rt!=NULL | | top!= -1) { while (rt!= NULL) //找此结点的最左边的后代 { s[++top].ptr=rt; //此结点进栈 s[top].depth=++length; rt=rt->lchild; //转移到左儿子子树 } #2 while if(length>depth) depth=length; if (top!= -1) { rt=s[top].ptr; length=s[top--].depth; rt=rt->rchild; } }//#1 while }
(3) 设计算法求二叉树的深度. 注:本算法也可以用二叉树遍历的所有算法。但是在用前 序和中序算法时要注意深度如何来确定。
解法一:
int BiTree::depth(BiNode<T> *rt) { if (rt ==NULL) return 0; else { hl= depth(rt->lchild); hr= depth(rt->rchild); return (hl>hr)?hl+1:hr+1; }
A.前序
B.中序
C.后序
D.层序
(9) 设森林中有4棵树,树中结点的个数依次为n1, n2, n3, n4, 则把森林转换成二叉树后,其根结点的右子树上有( D ) 个结点。根结点的左子树上有( A )个结点。 A.n1-1 B.nl C.nl+n2+n3 D.n2+n3+n4
(10) 讨论树、森林和二叉树的关系,目的是为了( B )。 A.借助二叉树上的运算方法去实现对树的一些运算 B.将树、森林按二叉树的存储方式进行存储并利用二叉 树的算法解决树的有关问题 C. 将树、森林转换成二叉树 D.体现一种技巧,没有什么实际意义
解法思想: 若根结点的值为x,则删除整个树;否则查找值为x 的结点的双亲p,然后删除此结点所对应的子树,同时修改p的 左(或右)孩子的指针。最好用前序遍历查找,后序遍历删除。
void BiTree::DeleteX(BiNode<T> *rt, T x) { if(rt!=NULL) { if(rt->data==x) {Release(rt); rt=NULL;} else{p=rt; top= -1; //采用顺序栈s,并假定不会发生上溢 while (p!=NULL | | top!= -1) { while (p!= NULL) //找此结点的最左边的后代 { s[++top]=p; //此结点进栈 if((p->lchild!=NULL )&&(p->lchild->data==x)) {Release(p->lchild); p->lchild=NULL;} if((p->rchild!=NULL )&&(p->rchild->data==x)) {Release(p->rchild); p->rchild=NULL;} p=p->lchild; } #2 while if (top!= -1) { p=s[top--]; p=p->rchild; } }//#1 while }}
int num=0; int BiTree::count(BiNode<T> *rt) { countsub(rt); return num; } void BiTree::countSub(BiNode<T> *rt) { if (rt !=NULL) { num++; countSub (rt->lchild); countSub (rt->rchild); } }
(11) 下列编码中,( B )不是前缀编码。 A. (00,01,10,11) B. (0,1,00,11) C.(0,10,110,111) D. (1,01,000,001) (12) 为5个使用频率不等的字符设计哈夫曼编码,不可能 的方案是( C ). A.111,110,10,01,00 B. 000,001,010,011,1 C. 100,11,10,1,0 D. 001,000,01,11,10 (13) 为5个使用频率不等的字符设计哈夫曼编码,不可能 的方案是( D ). A. 000,001,010,011,1 B. 0000,0001,001,01,1 C. 000,001,01,10,11 D. 00,100,101,110,111 (14) 设哈夫曼编码的长度不超过4,若已经对两个字符编 码为1和01,则最多还可以为( C )个字符编码. A. 2 B. 3 C. 4 D. 5
(7) 任何一棵二叉树的叶子结点在前序、中序、后序遍历序 列中的相对次序( A )。 A. 肯定不发生改变 B.肯定发生改变 C.不能确定 D.有时发生变化
(8) 如果T'是由有序树T转换而来的二叉树,那么T中结点的 前序序列就是T'中结点的( A )序列,T中结点的后序序列 就是T'中结点的( B )序列。
A B C E D G
F I
H
(5) 给出叶子结点的权值集合为 W={5,2,9,11, 8,3,7} 的哈夫曼树的构造过程。
45 26
19
10
5
2
9
11
8
15
7
5
3
5 算法设计
(1) 设计算法求二叉树的结点个数.
注:本算法可以用二叉树遍历的所有算法,只要把cout语句 换成结点的计数就可以了,但是要注意递归中的计数变量应 该是外部变量。如
1 填空题 (1)树是n(n≥0)个结点的有限集合。在一棵非空树 中,有(且仅有一个)根结点,其余结点分成m (m>=0)个(互不相交)的有限集合,每个集合又是一 棵树。 (2) 树中某结点的子树的个数称为该结点的( 度 ), 子树的根结点称为这个结点的( 孩子结点 ),该结点称 为其子树根结点的(双亲结点). (3) 一棵二叉树的第i(i≥1)层上最多有( 2i-1 )个结 点,一棵有n(n>0)个结点的满二叉树共有( (n+1)/2 ) 个叶子结点和( (n-1)/2 )个非终端结点。 (4) 设高度为h的二叉树只有度为0的和度为2的结点, 该二叉树的结点数可能达到的最大值是( 2h-1 ),最小 值是( 2 h -1 )。
(1) 设计算法求二叉树的结点个数.
其他解法一: int BiTree::count(BiNode<T> *rt) { if (rt ==NULL) return 0; else return count(rt->lchild)+count(rt->rchild)+1; } 其他解法二:用前序遍历的非递归算法 int BiTree::CountPreOrder(BiNode<T> *rt) {top= -1; p=rt; num=0;//采用顺序栈s,并假定不会发生上溢 while (p!=NULL | | top!= -1) { while (p!= NULL) //找此结点的最左边的后代 { num++; //访问 s[++top]=p; //此结点进栈 p=p->lchild; //转移到左儿子子树 } if (top!= -1) {p=s[top--]; p=p->rchild; }} return num; // cout<<num }