当前位置:文档之家› 树与二叉树练习题

树与二叉树练习题

树与二叉树练习题(五)
习题2010-05-25 17:27:01 阅读134 评论0 字号:大中小订阅
1. 己知二叉树采用二叉链表方式存放,要求返回二叉树T的后序序列中的第一个结点的指针,是否可以不用递归且不用栈来完成?请说明原因。

2.具有n个结点的满二叉树的叶子结点的个数是多少?说明理由。

3.列出先序遍历能得到ABC序列的所有不同的二又树。

4.画出同时满足下列两个条件的两棵不同的二叉树:
(1) 按先序遍历二叉树顺序为ABCDE;
(2) 高度为5,其对应的树(森林)的高度最大为4。

5.对于表达式(a-b+c)*d/(e+f)
(1) 画出它的中序二叉树,并标出该二叉树的前序线索;
(2) 给出它的前缀表达式和后缀表达式。

6.试找出分别满足下列条件的所有二叉树:
(1) 先序序列和中序序列相同;
(2) 中序序列和后序序列相同;
(3) 先序序列和后序序列相同。

7. 阅读下列算法的描述,根据算法的要求,在相应的空格处写出正确合理的语句。

后序遍历二叉树的非递归算法,bt是二叉树的根,S是一个栈,MaxSize是栈的最大容量。

typedef struct Node{
BTNode *[MaxSize+1];
int top;
} stacktyp;
void PostOrder(BTNode *bt)
{
BTNode *p, *q = bt;
stacktyp S;
int flag;
S.top = -1;
do{
while(q != NULL){
S.top++;
if(S.top > MaxSize){
printf("Stack Full!");
exit(0);
}
else
S.data[S.top] = q;
_______①_____;
}
flag = 1;
p = NULL;
while(S.top != -1 && flag){
q = S.data[S.top];
if(_________②__________){
printf(q->data);
S.to--;
p = q;
}
else {
_________③__________;
flag = 0;
}
}
}while(__________④__________);
}
8. 具有n个结点的完全二又树,已经顺序存储在一维数组A[n]中,下面算法是将A中顺序存储变成二叉链表存储的完全二又树。

请在空缺处填入适当语句,以完成上述算法。

Elemtype A[n];
void CreatTree(BTNode *T, int i)
{
_________①_________;
T->data = A[i];
if(________②________)
CreatTree(_______③________);
else
r->lchild = NULL;
if(_________④_________)
CreatTree(_______⑤________);
else
r->rchild = NULL;
}
void BTree(ar a, BTNOde *p)
{
int j;
j = ________⑥__________;
CreatTree(p, j);
}
9. 二叉树采用二叉链表存储结构,试设计算法计算一棵给定二叉树的各结点的子孙个数。

10. 一棵具有n个结点的完全二叉树,以一维数组作为存储结构,试设计一个对该完全二叉树进行前序遍历的算法。

11. 已知一棵二叉树的前序遍历序列和中序遍历序列,编写算法建立对应的二叉树。

12. 编写一个算法,利用叶子结点中的空指针域,将所有叶子结点链接为一个带有头结点的单链表,算法返回头结点的地址。

字符串练习题(四)
习题2010-04-26 17:20:23 阅读138 评论0 字号:大中小订阅
1. 设s=‘I_AM_A_TEACHER’,其长度是_________________。

2.空串是______________,其长度等于________________。

3.设sl=‘GOOD’,s2=‘☆’,s3=‘BYE!’,则sl、s2和s3连接后的结果是________。

4.两个串相等的充分必要条件是___________________。

5.简述一个字符串中子串的构成。

★6. 设目标为s=’abcaabbabcabaacbacba’,模式p=’abcabaa’。

(1) 计算模式p的nextval函数值;
(2) 不写出算法,只画出利用KMP算法(采用next函数值)进行模式匹配时每一趟的匹配过程。

★7. 模式匹配算法是在主串中快速寻找模式的一种有效的方法。

如果设主串的长度为m,模式的长度为n,则在主串中寻找模式的KMP算法的时间复杂性是多少?如果某一模式p=’abcaacabaca’,请给出它的next 函数值及next函数的修正值nextval之值。

【说明】
第6题、第7题可以不做。

栈与队列练习题(三)
习题2010-04-25 17:19:42 阅读216 评论0 字号:大中小订阅
1.循环队列的优点是什么?如何判别它的空和满?
2.内存中一片连续空间(不妨假设地址从0到m-1)提供给两个栈S1与S2使用,怎样分配这部分存储空间,使得对任一个栈仅当这部分空间全满时才发生上溢。

3.利用两个栈Sl和S2模拟一个队列(如客户队列)时,如何用栈的运算实现队列的插入、删除运算。

请简述算法思想。

4.在栈顶指针为head的链栈中,编写计算该链栈中结点个数的算法。

5.编写算法计算链队列Q中结点的个数。

6.假设以带头结点的循环单链表表示队列,并且只设一个指针rear指向队尾结点,但不设头指针,请写出相应的入队列和出队列算法。

7. 假设以I和O分别表示入栈和出栈操作,栈的初态和终栈均为空,入栈和出栈的操作序列可表示为仅由I和O组成的序列。

(1) 下面所示的序列中哪些是合法的?
A.IOIIOIOO B.IOOIOIIO C.IIIOIOIO D.IIIOOIOO
(2) 通过对(1)的分析,写出一个算法:判定所给的操作序列是否合法,若合法返回l;否则返回0。

(假设被判定的操作序列已存入一维数组中)。

8. 设有两个栈S1,S2都采用顺序栈方式,并且共享一个存储区[0..MAXSIZE-1],为了尽量利用空间,减少溢出可能,可采用栈顶相向、迎面增长的存储方式,试设计Sl,S2有关入栈和出栈的操作算法。

#define MAXSIZE 100
typedef struct Sq_DoubleStack{
Elemtype data[MAXSIZE];
int top1, top2;
} Stack;
int Sq_DoublePush(Stack &S, Elemtype x, int flag)
{// 如果flag=1,将元素x压到栈S1中,如果flag=2,将元素x压到栈S2中
...
}
int Sq_DoublePop(Stack &S, Elemtype &x, int flag)
{// 如果flag=1,弹出栈S1中的元素,如果flag=2,弹出栈S2中的元素
...
}。

相关主题