数据结构 第四章树习题课

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
A B F G H L 图4.25 树 C D I J M E K
4
一、填空题
(1)对于一棵具有n个结点的树,该树中所有结点度数之和为 n-1 。
a1 ( q h 1) 1 ( k h 1) k h 1 q 1 k 1 k 1
(2) k叉树上的i层最大有 ki-1 个结点。
17
5
一、填空题
(4)在一棵二叉树中,若度为2的结点数有5个,度为1 的结点数 有6个,那么度为0的结点数有
6
个?
(5)在一棵三叉树中,若度为3的结点数有2个,度为2的结点数 有1个,度为1 的结点数有2个,那么度为0的结点数有
6 个?
(4) n=n0+n1+n2=n0+5+6=e+1=2*5+1*6+1 => n0=6
}
16
4. 统计二叉树的高度
int high(BinaryTreeNode *t) { if (!t) return 0;
lh=high(t->leftChild);
rh=high(t->rightChild);
return 1+(lh>rh?lh:rh);
} int Depth (BinaryTreeNode *t ) { if (!t ) return 0; else return 1+Max ( Depth ( t→leftChild ), Depth ( t→rightChild ) ); }
(3) 高度为h的k叉树最多有
个结点。
n个结点的k叉树的最小高度为
log
n ( k 1) 1 k


假定一棵三叉树的结点个数为50,则它的最小高度为 log 101 3 最大高度为 50 。 一棵高度为5的满二叉树中的结点数为 25-1 一棵高度为3的满四叉树中的结点数为 (43-1)/3 。 。
=1+ (i 1) ni
i2
12
m
3、试分别找出满足下列条件的所有二叉树: (1)二叉树的前序遍历与中序遍历相同; (2)二叉树的中序遍历与后序遍历相同; (3)二叉树的前序遍历与后序遍历相同;
(1) 空二叉树或左子树为空的二叉树。
(2) 空二叉树或右子树为空的二叉树。
(3) 空二叉树或只有根结点的二叉树。
if((t->leftChild&&!t->rightChild)|| (!t->leftChild&&t->rightChild))
return 1;
return Degrees1(t->leftChild)+Degrees1(t->rightChild); }或 int Degrees1(BinTreeNode *t) { if (!t) return 0;
第四章 树与二叉树
习题课
1
作业:p125 4-1 (省略) 4-3 有m个叶子的二叉树最少有多少个结点?
4-4 现有按后序遍历二叉树的结果为C,B,A,有
几种不同的二叉树可得到这一结果?
A
B C
2
4-10 设计一个算法,将一个用二叉链表存储的二 叉树的每个结点的左、右子女位置交换。
void Change (BinTreeNode *t) {
(7)对于一棵具有n个结点的二叉树的二叉链表中,指针总数为
为 2n ,其中 n-1 个指针指向子女结点, n+1 指针空闲。
7
(8)在Huffman树中,若编码长度只允许小于等于4,则除了已
对两个字符编码为0和10外,还可最大对
4 个字符பைடு நூலகம்码。
(9)设高度为h(h≥1)的二叉树中,若设二叉树只有度为0和
(5) n=n0+n1+n2+n3=n0+2+1+2=e+1=3*2+2*1+1*2+1
=> n0=6
6
(6)若对一棵二叉树从0开始进行结点编号, 并按此编号把它顺序
存储到一维数组a中,则a[i]元素的左子女结点编号为 2i+1 ,
右子女结点编号为
2i+2
,双亲结点编号为
i 1 2 。
cout <<p->data; s.Push(p); p=p->leftChild; }
if(!s.IsEmpty()){ p=s.Pop();p=p->rightChild; }//if }//while }// lnOrderTraverse
11
1、3个结点的树和二叉树个共有多少不同形态?
树有2种,二叉树有5种。 2、如一棵树有n1个度为1的结点,有n2个度为2的 结点,……, nm个度为m的结点,试问有多少个度 为0的结点? 解:n=n0+n1+n2+…+nm n-1=n1+2*n2+…+mnm 化简:n=1+n2+2n3+…+(m-1)nm
A
Preorder(r->leftChild);
r=r->rightChild; } }
}
B D
C
E
10
非递归的前序遍历算法:
void PreOrderTraverse(BinaryTreeNode *r){
Stack s; s.InitStack();p=r;
while(p || !s.IsEmpty()){ while(p) {
if((t->leftChild&&!t->rightChild)|| (!t->leftChild&&t->rightChild))
return 1+Degrees1(t->leftChild)+Degrees1(t->rightChild); }
15
3. 统计二叉树中度为2的结点个数。
int Degrees2(BinTreeNode *t) { if (!t) return 0; if(t->leftChild && t->rightChild) return 1+Degrees2(t->leftChild)+Degrees2(t->rightChild);
13
四、设二叉树以二叉链表表示,试编写有关二叉树的递归算法。 1. 统计二叉树中叶结点的个数。 int Degrees0(BinTreeNode *t) { if (!t) return 0; if(!t->leftChild && !t->rightChild) return 1; return Degrees0(t->leftChild)+Degrees0(t->rightChild); } 或 void Degrees0(BinTreeNode *t,&count) {
度为2的结点,则二叉树中所含结点个数至少
2h-1
个。
(10)设森林F中有4棵树,第1,2,3,4棵树的结点个数分别 为n1,n2,n3,n4,当把该森林F转换成一棵二叉树后,其根结点的 左子树有 n1 个结点,右子树有 n2+n3+n4 个结点。
8
二、判断题
(11) 二叉树是树的特殊情形。 × (12) 若有一个结点是二叉树中某个子树的中序遍历结 果序列的最后一个结点,则它一定是该子树的前序遍 历结果序列的最后一个结点。 × (13) 若有一个叶结点是二叉树中某个子树的中序遍历 结果序列的最后一个结点,则它一定是该子树的前序 遍历结果序列的最后一个结点。× (14) 若有一个叶结点是二叉树中某个子树的前序遍历 结果序列的最后一个结点,则它一定是该子树的中序 遍历结果序列的最后一个结点。 ×
9
二、对二叉树递归算法的理解
void Preorder(BinTree *r) { // 前序遍历的递归算法 void Preorder(BinTree *r) { // 消去前序遍历第二个递归调用 while(r) { cout<<r->data;
if(r) {
cout<<r->data; ② Preorder(r->leftChild); ① Preorder(r->rightChild); }
if (t) {
if(!t->leftChild && !t->rightChild) count++; Degrees0(t->leftChild, count);
Degrees0(t->rightChild, count); }
}
14
四、设二叉树以二叉链表表示,试编写有关二叉树的递归算法。 2. 统计二叉树中度为1的结点个数。 int Degrees1(BinTreeNode *t) { if (!t) return 0;
if (!t) return 0; if(t->leftChild||t->rightChild) {
p= t->leftChild;
t->leftChild= t->rightChild;
t->rightChild=p;
} }
3
4-14.将图4.25中的树转换成二叉树。然后对树和转 换成的二叉树分别进行适当的遍历,并加以对比。
相关文档
最新文档