最新数据结构习题课4说课讲解
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一棵二叉树形的所有的叶结点,在先根次 序、中根次序和后根次序下的排列都按相 同的相对位置出现。
A
B
C
D
E
F
G
H
I
J
K
L
先根: A B C E I F J D G H K L 中根: E I C F J B G D K H L A 后根: I E J F C G K L H D B A
数学归纳法
令n等于二叉树的高度; n=0时
IF t1=NULL AND t2=NULL THEN RETURN true. IF t1=NULL OR t2=NULL THEN RETURN false. L2[递归调用] RETURN Like(left(t1),left(t2)) AND Like(right(t1),right(t2)). ▌ 时间复杂度为O(n1+n2)
cout<<t->data<<endl; if(height(t->left)>height(t->right)) t=t->left; else t=t->right; } }
时间复杂度为O(n2)或O(n*h)。原因在于高度 的重复计算。在每个结点中引入高度域,可以 将时间复杂度为降为O(n)。
设有一个指针数组,下标代表编号,数组元素代表结点。出 现空缺编号或编号大于n,则不是完全二叉树。
建立编号函数,递归记录结点数和编号最大值
参考算法如下
为此,在层次遍历二叉树时,增加一个标 志B,B=1表示所有已扫描过的结点均有左 、右孩子,B=0,表示遇到无左或右孩子的 结点,此后的所有结点均应为叶结点。
4-8
对于下图所示的树
(a)对其进行先根和后根遍历。 (b)给出其在自然对应下的二叉树。
B EF KGJwenku.baidu.com
A
C
D
G
HI
参考答案
(a)对其进行先根和后根遍历。 先根遍历:ABEKGJFCGDHI
B=0; if (p->right != NULL) return false; } else Q.Insert(p->left); if (p->right = = NULL) B=0; else Q.Insert(p->right); }
while (!Q.QueueEmpty()) //处理剩余叶节点 {
相当于求根结点开始的最长路径。可以根据左 右子树的高度确定下一步的结点。
参考答案
int height(BinTreeNode<T>* t) {
if(t==NULL) return -1; return 1+max(height(t->left),height(t->right)); } void path(BinTreeNode<T>* t) { while(t){
p=Q.Delete(); if ( p->left ! = NULL) || ( p->right ! = NULL)
return false; }
return true; }
4-6
编写算法求任意二叉树中一条最长的路径,并 输出此路径上各结点的值。
分析
教材中,树上的路径定义:若树T中存在结点 序列Vm --> Vm+1 -->…--> Vm+k ,1<= k <=T的 最大层数, Vi+1 是 Vi 的子结点。
数据结构习题课4
第4章作业
4-2,4-3, 4-5,4-6,4-7,4-8, 4-10, 4-12,4-13
作业4-2
题目描述
由三个结点A,B和C可以构成多少棵不同的 树?可以构成多少棵不同的二叉树?
树有2种形态:6+3=9种 二叉树有5种形态:6*5=30种
作业4-3
判断以下命题是否为真?若真,请证明之 ;否则,举出反例。
{ maxl=height(t->left)+height(t->right)+2>maxl; lstp=t;
} Longest(t->left); Longest(t->right); }
其它方法
课后提示:非递归后根遍历,当i=2是,判断 是否为叶子节点,若是就与当前记录的最长路 径比较,大于就更新最大路径值及最大路径。
分析
完全二叉树的叶子结点只能在层数最大两层出现,并 且连续出现
在层次遍历二叉树时,增加一个标志B,B=1表示所有已扫 描过的结点均有左、右孩子,B=0,表示遇到无左或右孩子 的结点,此后的所有结点均应为叶结点。
层次遍历时,空指针可以入队。出队遇到第一个空指针时, 此后队列里的都是空指针。
对所有结点按完全二叉树编号,记录编号的最大值和 结点数n。相等,则是完全二叉树。
时间复杂性为 T(n)=2n 或 O(n)
bool completetree(BintreeNode * t) {
Bool B=1; Queue Q ; if (t!=NULL) Q.Insert(t); while (!Q.QueueEmpty() && B) {
p=Q.Delete(); if (p->left = = NULL) {
命题成立 假设 n = k 时命题成立,往证n=k+1时命题也
成立。当 n = k+1 时,对任意两个叶结点l1,l2 ,有三种情况
l1,l2 都在根的左子树中。 l1,l2 都在根的右子树当中。 l1,l2 不在根的同一个子树当中。
作业4-5
编写一算法,判别给定二叉树是否为完全二叉 树。
树上的路径也有另一种理解,即图论的理解。 这时,最长路不一定是从根结点出发的,需要 先确定路径最长的结点,然后按前面的方法处 理。也可以按第五章的方法处理。
TreeNode<T>* lstp=NULL; int maxl=-1; void Longest(TreeNode<T>* t) {
if(t==NULL) return NULL; if(height(t->left)+height(t->right)+2>maxl)
回溯法:引入一个数组记录路径上的结点。递 归出口是叶子结点。非叶子结点继续尝试和修 改
4-7
编写算法判断两棵二叉树T和T’是否相似。两 棵二叉树相似是指它们具有相同结构。
参考答案
算法Like(t1,t2) /*判断两棵二叉树是否相似,t1,t2表示两棵树的根节点。
若相似,返回值为true,否则为false*/ L1[递归出口]
A
B
C
D
E
F
G
H
I
J
K
L
先根: A B C E I F J D G H K L 中根: E I C F J B G D K H L A 后根: I E J F C G K L H D B A
数学归纳法
令n等于二叉树的高度; n=0时
IF t1=NULL AND t2=NULL THEN RETURN true. IF t1=NULL OR t2=NULL THEN RETURN false. L2[递归调用] RETURN Like(left(t1),left(t2)) AND Like(right(t1),right(t2)). ▌ 时间复杂度为O(n1+n2)
cout<<t->data<<endl; if(height(t->left)>height(t->right)) t=t->left; else t=t->right; } }
时间复杂度为O(n2)或O(n*h)。原因在于高度 的重复计算。在每个结点中引入高度域,可以 将时间复杂度为降为O(n)。
设有一个指针数组,下标代表编号,数组元素代表结点。出 现空缺编号或编号大于n,则不是完全二叉树。
建立编号函数,递归记录结点数和编号最大值
参考算法如下
为此,在层次遍历二叉树时,增加一个标 志B,B=1表示所有已扫描过的结点均有左 、右孩子,B=0,表示遇到无左或右孩子的 结点,此后的所有结点均应为叶结点。
4-8
对于下图所示的树
(a)对其进行先根和后根遍历。 (b)给出其在自然对应下的二叉树。
B EF KGJwenku.baidu.com
A
C
D
G
HI
参考答案
(a)对其进行先根和后根遍历。 先根遍历:ABEKGJFCGDHI
B=0; if (p->right != NULL) return false; } else Q.Insert(p->left); if (p->right = = NULL) B=0; else Q.Insert(p->right); }
while (!Q.QueueEmpty()) //处理剩余叶节点 {
相当于求根结点开始的最长路径。可以根据左 右子树的高度确定下一步的结点。
参考答案
int height(BinTreeNode<T>* t) {
if(t==NULL) return -1; return 1+max(height(t->left),height(t->right)); } void path(BinTreeNode<T>* t) { while(t){
p=Q.Delete(); if ( p->left ! = NULL) || ( p->right ! = NULL)
return false; }
return true; }
4-6
编写算法求任意二叉树中一条最长的路径,并 输出此路径上各结点的值。
分析
教材中,树上的路径定义:若树T中存在结点 序列Vm --> Vm+1 -->…--> Vm+k ,1<= k <=T的 最大层数, Vi+1 是 Vi 的子结点。
数据结构习题课4
第4章作业
4-2,4-3, 4-5,4-6,4-7,4-8, 4-10, 4-12,4-13
作业4-2
题目描述
由三个结点A,B和C可以构成多少棵不同的 树?可以构成多少棵不同的二叉树?
树有2种形态:6+3=9种 二叉树有5种形态:6*5=30种
作业4-3
判断以下命题是否为真?若真,请证明之 ;否则,举出反例。
{ maxl=height(t->left)+height(t->right)+2>maxl; lstp=t;
} Longest(t->left); Longest(t->right); }
其它方法
课后提示:非递归后根遍历,当i=2是,判断 是否为叶子节点,若是就与当前记录的最长路 径比较,大于就更新最大路径值及最大路径。
分析
完全二叉树的叶子结点只能在层数最大两层出现,并 且连续出现
在层次遍历二叉树时,增加一个标志B,B=1表示所有已扫 描过的结点均有左、右孩子,B=0,表示遇到无左或右孩子 的结点,此后的所有结点均应为叶结点。
层次遍历时,空指针可以入队。出队遇到第一个空指针时, 此后队列里的都是空指针。
对所有结点按完全二叉树编号,记录编号的最大值和 结点数n。相等,则是完全二叉树。
时间复杂性为 T(n)=2n 或 O(n)
bool completetree(BintreeNode * t) {
Bool B=1; Queue Q ; if (t!=NULL) Q.Insert(t); while (!Q.QueueEmpty() && B) {
p=Q.Delete(); if (p->left = = NULL) {
命题成立 假设 n = k 时命题成立,往证n=k+1时命题也
成立。当 n = k+1 时,对任意两个叶结点l1,l2 ,有三种情况
l1,l2 都在根的左子树中。 l1,l2 都在根的右子树当中。 l1,l2 不在根的同一个子树当中。
作业4-5
编写一算法,判别给定二叉树是否为完全二叉 树。
树上的路径也有另一种理解,即图论的理解。 这时,最长路不一定是从根结点出发的,需要 先确定路径最长的结点,然后按前面的方法处 理。也可以按第五章的方法处理。
TreeNode<T>* lstp=NULL; int maxl=-1; void Longest(TreeNode<T>* t) {
if(t==NULL) return NULL; if(height(t->left)+height(t->right)+2>maxl)
回溯法:引入一个数组记录路径上的结点。递 归出口是叶子结点。非叶子结点继续尝试和修 改
4-7
编写算法判断两棵二叉树T和T’是否相似。两 棵二叉树相似是指它们具有相同结构。
参考答案
算法Like(t1,t2) /*判断两棵二叉树是否相似,t1,t2表示两棵树的根节点。
若相似,返回值为true,否则为false*/ L1[递归出口]