东北大学计算机初试历年二叉树算法题目及解答

合集下载

2003年东北大学考研计算机真题答案

2003年东北大学考研计算机真题答案

/*------------------------------------------2003数据结构部分-------------------------------------------*/ 二、已知f为单链表的表头指针,链表中存储的都是整型数据,试设计算法将此链表的结点按照递增次序进行就地排序。

void InsertSort_L(Linklist &La){//用直接插入排序使链表递增有序if(La->next){//链表不空p = La->next->next;La->next->next = Null;while(p != NULL){r = p->next; //暂存p的后继q = La;while(q->next && q->next->data < p->data)q = q->next; //查找插入位置p->next = q->next; //插入q->next = p;p = r;}//while}//if}三、给出中序线索二叉树的结点结构,试编写在不使用栈和递归的情况下先序编历中序线索二叉树的算法.void InTraveseThr(BitTree thrt){//遍历中序线索二叉树p = thrt->lchild; //p指二叉树根结点while (p!=thrt){while(p->Ltag == 0)p = p->lchild;printf(p->data);while(p->rtag == 1 && p->rchild != thrt){p = p->rchild;printf(p->data);}//whilep = p->rchild;}//while}//InTraversethr四、设关键字是一个由26个小写字母组成的字符串,哈希表的长度为26。

计算机专业基础综合(树与二叉树)-试卷2

计算机专业基础综合(树与二叉树)-试卷2

计算机专业基础综合(树与二叉树)-试卷2(总分:70.00,做题时间:90分钟)一、单项选择题(总题数:23,分数:46.00)1.单项选择题1-40小题。

下列每题给出的四个选项中,只有一个选项是最符合题目要求的。

(分数:2.00)__________________________________________________________________________________________ 解析:2.设树T的度为4,其中度为1、2、3和4的结点个数分别为4、1、1、1,则T中的叶子数为( )。

(分数:2.00)A.10B.11C.9D.7 √解析:解析:根据题中条件可知,1×4+2×1+3+4+1=4+1+1+1+n 0,由此可以得出:n 0=1×4+2×1+3+4+1-(4+1+1+1)=14-7=7。

3.用下列元素序列(22,8,62,35,48)构造平衡二又树,当插入( )时,会出现不平衡的现象。

(分数:2.00)A.22B.35C.48 √D.6248后,首次出现不平衡子树,虚线框内即为最小不平衡子树。

4.下面的算法实现了将二叉树中每一个结点的左右子树互换。

addQ(Q,bt)为进队的函数,delQ(Q)为出队的函数,empty(Q)为判别队列是否为空的函数,空白处应填的内容是( )。

typedef struct node{ int data;struct node*lchild,*rchild;}btnode;void exchange(btnode*bt){ btnode*p,*q;if(bt){ addQ(Q,bt);while(!EMPTY(Q)){ p=delQ(Q);q=p->rchild;p一>rChild=p一>lchild;( (1) )=q;if(p->lchild) ( (2) ): if(p->rchild)addQ(Q,p->rchild): } }}(分数:2.00)A.p一>lchild,delQ(Q,p->lchild)B.p->rchild,delQ(Q,p->lchild)C.p一>lchild,addQ(Q,p->lchild) √D.p->rchild,addQ(Q,p->lchild)解析:5.已知有一棵二叉树,其高度为n,并且有且只有n个结点,那么二叉树的树形有( )种。

东北大学计算机初试历年二叉树算法题目及解答

东北大学计算机初试历年二叉树算法题目及解答

[1996]设t为一棵二叉树的根结点地址指针,试设计一个非递归算法完成把二叉树中每个结点的左右孩子位置交换。

int swithLRChild(BiTree *t){ BiTree *stack[100] = {0};int stack_length = 0;if (NULL == t){return 0;}stack[stack_length++] = t;while (stack_length > 0){//pop stackBiTree *node = stack[stack_length - 1];stack_length -= 1;BiTree *temp = node->lchild;node->lchild = node->rchild; node->rchild = temp;if (NULL != node->rchild){ stack[stack_length++] = node->rchild;}if (NULL != node->lchild){stack[stack_length++] = node->lchild;}}return 1;}[1998]一棵高度为K且有n个结点的二叉排序树,同时又是一棵完全二叉树存于向量t中,试设计删除树中序号为i且具有左右孩子的一个结点,而不使存储量增加保证仍为二叉排序树(不一定是完全二叉树)的算法。

//存数据的位置是从1的索引开始的,避免需要访问索引为0的空间,避免需要频繁的索引转换void delNodeInSortedBiTree(int *sorted_bitree, int *last_index,int i){//因为题目中描述具有左右孩子,所以直接从左孩子的最右边叶子节点开始//分两种情况,左孩子没有右孩子,那么左孩子之后的节点都移动一个位子//左孩子存在右孩子,则从右孩子的左孩子一直走,到叶子节点停止,因为是叶子节点//就不需要移动元素了int del_node_index = 2*i;if (2*del_node_index + 1 >= *last_index){//左孩子只存在左子树sorted_bitree[i] = sorted_bitree[del_node_index];while (del_node_index*2 <= *last_index){//后面的位置都往上移动sorted_bitree[del_node_index] = sorted_bitree[2*del_node_index];del_node_index *= 2;}sorted_bitree[del_node_index] = -1;printf("last_index:%d\n", *last_index);}else{//移动到左孩子的右孩子del_node_index = del_node_index*2 + 1;while (2*del_node_index <= *last_index){del_node_index *= 2;}//因为叶子节点,所以不需要移动printf("r:%d rp:%d\n", sorted_bitree[i], sorted_bitree[del_node_index]);sorted_bitree[0] = sorted_bitree[del_node_index];sorted_bitree[del_node_index] = -1;}}[2002]对以二叉链表存储的非空二叉树,从右向左依次释放所有叶子结点,释放的同时,把结点值存放到一个向量中。

二叉树的遍历题目及答案

二叉树的遍历题目及答案

二叉树的遍历题目及答案1. 二叉树的基本组成部分是:根(N)、左子树(L)和右子树(R)。

因而二叉树的遍历次序有六种。

最常用的是三种:前序法(即按N L R次序),后序法(即按L R N 次序)和中序法(也称对称序法,即按L N R次序)。

这三种方法相互之间有关联。

若已知一棵二叉树的前序序列是BEFCGDH,中序序列是FEBGCHD,则它的后序序列必是 F E G H D C B 。

解:法1:先由已知条件画图,再后序遍历得到结果;法2:不画图也能快速得出后序序列,只要找到根的位置特征。

由前序先确定root,由中序先确定左子树。

例如,前序遍历BEFCGDH中,根结点在最前面,是B;则后序遍历中B一定在最后面。

法3:递归计算。

如B在前序序列中第一,中序中在中间(可知左右子树上有哪些元素),则在后序中必为最后。

如法对B的左右子树同样处理,则问题得解。

2.给定二叉树的两种遍历序列,分别是:前序遍历序列:D,A,C,E,B,H,F,G,I;中序遍历序列:D,C,B,E,H,A,G,I,F,试画出二叉树B,并简述由任意二叉树B的前序遍历序列和中序遍历序列求二叉树B的思想方法。

解:方法是:由前序先确定root,由中序可确定root的左、右子树。

然后由其左子树的元素集合和右子树的集合对应前序遍历序列中的元素集合,可继续确定root的左右孩子。

将他们分别作为新的root,不断递归,则所有元素都将被唯一确定,问题得解。

3、当一棵二叉树的前序序列和中序序列分别是HGEDBFCA和EGBDHFAC时,其后序序列必是A. BDEAGFHCB. EBDGACFHC. HGFEDCBAD. HFGDEABC答案:B4. 已知一棵二叉树的前序遍历为ABDECF,中序遍历为DBEAFC,则对该树进行后序遍历得到的序列为______。

A.DEBAFCB.DEFBCAC.DEBCFAD.DEBFCA[解析] 由二叉树前序遍历序列和中序遍历序列可以唯一确定一棵二叉树。

二叉树算法题

二叉树算法题

二叉树算法题
题目一:二叉树的深度
给定一个二叉树,找出其最大深度。

示例:
输入:
# 定义二叉树节点
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
# 创建二叉树
root = TreeNode(3)
root.left = TreeNode(9)
root.right = TreeNode(20)
root.right.left = TreeNode(15)
root.right.right = TreeNode(7)
输出:
4
解释:二叉树的深度为4,分别是 [3], [9, 20], [15, 7] 和 []。

提示:递归深度优先搜索 (DFS) 是一个有效的解决方案。

对于每个节点,我们可以递归地计算其左子树和右子树的深度,然后返回最大的深度。

为了避免重复计算,我们可以使用一个队列来存储已访问的节点。

在计算深度的过程中,我们需要跟踪当前的深度。

当我们到达一个节点的深度时,我们就可以从队列中删除它,因为我们不需要再次计算它。

为了避免进入无限循环,我们需要在算法中使用一个变量来记录访问过的节点数量,如果超过了树中的节点数量,我们可以提前返回结果。

计算机专业基础综合数据结构树和二叉树历年真题试卷汇编10_真题(含答案与解析)-交互

计算机专业基础综合数据结构树和二叉树历年真题试卷汇编10_真题(含答案与解析)-交互

计算机专业基础综合数据结构(树和二叉树)历年真题试卷汇编10(总分68, 做题时间90分钟)1. 单项选择题1.先序序列为a,b,c,d的不同二叉树的个数是( )。

【2015年全国试题2(2分)】SSS_SINGLE_SELA 13B 14C 15D 16分值: 2答案:C解析:先序序列为1,2,3,…,n的不同的二叉树的数目是1/(n+1)((2n)!/(n!*n!))。

2.下列选项给出的是从根分别到达两个叶结点路径上的权值序列,能属于同一棵哈夫曼树的是( )。

【201 5年全国试题3(2分)】SSS_SINGLE_SELA 24,10,5和24,10,7B 24,10,5和24,12,7C 24,10,10和24,14,11D 24,10,5和24,14,6分值: 2答案:D解析:A的错误在于若路径上有两个10,叶子5应和另一个权值5组成左右子女,7和3组成左右子女,显然不符合哈夫曼的构造规则(应该3和5组成左右子女构造双亲结点);若路径上只有一个10,5和7并非其左右子女。

B的错误在于双亲10和双亲12不可能构造双亲24。

C的错误是路径上不可能有相同权值10的结点。

D是正确的,双亲10的另一个子女是5,双亲14的另一个子女是8,而双亲10和双亲14恰是双亲24的左右子女。

3.树是一种逻辑关系,表示数据元素之间存在的关系为( )。

【北京交通大学2007(2分)】SSS_SINGLE_SELA 集合关系B 一对一关系C 一对多关系D 多对多关系分值: 2答案:C4.下列判断,( )是正确的。

【华南理工大学2005一、1(2分)】SSS_SINGLE_SELA 二叉树就是度为2的树B 二叉树中不存在度大于2的结点C 二叉树是有序树D 二叉树的每个结点的度都为2分值: 2答案:B解析:二叉树与树是两个不同的概念。

相同点是二者都是树形结构,不同点有三:一是二叉树的度至多是2,树无此限制;二是二叉树的子树有左右子树之分,只有一棵子树时,也必须区分是左子树还是右子树,树不必这样;三是二叉树允许为空,树不准为空,但是多数教科书认为树可以为空,否则空二叉树无法转换成空树,本题第一问有二义性。

东北大学计算机专业基础(含C语言程序设计、数据结构)1996—2019(缺2005、2012)年

东北大学计算机专业基础(含C语言程序设计、数据结构)1996—2019(缺2005、2012)年

东北大学 97 考研题
一、(25 分)按要求完成下题 1 知 U=‘xyxyxyxxyxy’;t=‘xxy‘; ASSIGN(S,U); ASSIGN(V,SUBSTR(S,INDEX(s,t),LEN(T)+1)); ASSIGN(m,‘ww’) 求 REPLACE(S,V,m)= 2 知广义表 A=(((a)),(b),c,(a),(((d,e))))
东北大学 96 考研题
一、(25 分)每小题 5 分 1. 根据下图完成:
1) 画出该图的十字链表存储结构图。 2) 写出其拓扑排序的输出序列。 3) 写出图的强连通分量(支)。 4) 写出到的所有路径及简单路径。 2.给定 8 个权值集合(2,5,3,10,4,7,9,18)画出含有 8 个叶子结点的最佳三叉 归并树,并计算出 3.知含有 8 个结点的一棵二叉树,按先序、中序、后序进行遍历后,有些结点序号不清 楚如下图示。要求构造出一棵符合条件的二叉树。
四、1与L2分别为两单链表头结点,地址指针,且两表中数据结与L2中数据相同的连续结点顺序完全倒置的算法。例:
(15分)
五、知输入关键字序列为(100,90,120,60,78,35,42,31,15)
址区向为0~11。设计一个哈希表函数把上述关键字散到0~11中画出散列表(冲突
用线性探测法);写出查找算法,计算在等概率情况下查找长度。
(15分)
六、一棵高度K具有n个结点的二叉树,按顺序方式存贮:
1)编写用先根遍历树中每个结点的递归算法;
2)编写将树中最大序号叶子结点的祖先结点全部打印输出的算法。
(20分)。
东北大学 98 考研题
一.完成下列各小题(每小题 10 分,共计 30 分)。 1)知三个字符分别为 s=’ab…abcaabcbca…a’ s’=’caab’, s’’=’bcb’ 利用所学字符串基本运算的函数得到结果串为 s’’’=’caabcbca…aca…a’ 要求写出得到上结果串 S“‘所用的函数及执行算法。 2)知记录关键字集合为(53,17,19,61,98,75,79。63,49,46)要求散列到地 址区间(100,101,102,103,104,105,106,107,108,109)内,若产生冲突用开 型寻址法的线性探测法解决。要求写出选用的散列函数;形成的散列表;计算出查找成 功时平均查找长度与查找不成功的平均查找长度。(设等概率情况) 2)知一棵 3 阶 B-树如下图所示: 1)画出查入(18)的 3 阶 B-树计算读结点/写结点次数。

东北大学历年初试考研真题分享

东北大学历年初试考研真题分享
16
21115
196
3314
186
5、(方向移动,试举例说明之。快速排序中有没有这种现象?
二、(15分)设有一个由正整数组成的无序(向后)单链表,编写完成下列功能的算法:
1、找出最小值结点,且打印该数值;
2、若该数值是奇数,则将其与直接后继结点的值交换;
3、若该数值是偶数,则将其直接后继结点删除;
三、(14分)解答下列问题:
1、(4分)将算术表达式((a+b)+c*(d+e)+f)*(g+h)转化为二叉树;
2、(10分)假设一个仅包含二元运算符的算术表达式以链表形式存储在二叉树b1中,写出计算该表达式值的算法。
四、(21分)解答下列问题:
1、(5分)画出有向图十字链表存储结构中头接点和表结点的结点结构。
5、设有1000个无序的元素,希望用最大的速度挑选出其中前十个最大的元素,在以下的方法中采用哪一种最好?为什么?(3分)
(快速排序,归并排序,堆排序,基数排序,shell排序)
二、(10分)两个正数序列A=a1,a2,a3,…..am和B=b1,b2,b3,…bn已经存入两个单链表中,设计一个算法,判别序列B是否是序列A的子序列。
(1)、构造出散列函数;(3分)
(2)、计算出等概率情况下查找成功的平均查找长度;(3分)
(3)、计算出等概率情况下查找失败的平均查找长度;(3分)
4、判别一下序列是否为堆,若不是,则把他调整为堆。
(1)(100,86,48,73,35,39,42,57,66,21)(4分)
(2)(12,70,33,65,24,56,48,92,86,33)(4分)
(4)在m阶B一树中每个结点上至少┌m/2┐有个关键字最多m有个关键字。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

[1996] 设t 为一棵二叉树的根结点地址指针,试设计一个非递归算法完成把二叉树中每个结点的左右孩子位置交换。

int swithLRChild(BiTree *t){ BiTree *stack[100] = {0};int stack_length = 0;if (NULL == t){return 0;}stack[stack_length++] = t;while (stack_length > 0){//pop stackBiTree *node = stack[stack_length - 1];stack_length -= 1;BiTree *temp = node ->lchild;node->lchild = node ->rchild; node->rchild = temp;if (NULL != node ->rchild){ stack[stack_length++] = node ->rchild;}if (NULL != node ->lchild){stack[stack_length++] = node ->lchild;}}return 1;}[1998]一棵高度为K 且有n个结点的二叉排序树,同时又是一棵完全二叉树存于向量t 中,试设计删除树中序号为i 且具有左右孩子的一个结点,而不使存储量增加保证仍为二叉排序树(不一定是完全二叉树)的算法。

//存数据的位置是从 1 的索引开始的,避免需要访问索引为0 的空间,避免需要频繁的索引转换void delNodeInSortedBiTree(int *sorted_bitree, int *last_index,int i){//因为题目中描述具有左右孩子,所以直接从左孩子的最右边叶子节点开始//分两种情况,左孩子没有右孩子,那么左孩子之后的节点都移动一个位子//左孩子存在右孩子,则从右孩子的左孩子一直走,到叶子节点停止,因为是叶子节点//就不需要移动元素了int del_node_index = 2*i;if (2*del_node_index + 1 >= *last_index)//左孩子只存在左子树sorted_bitree[i] = sorted_bitree[del_node_index];while (del_node_index*2 <= *last_index){//后面的位置都往上移动sorted_bitree[del_node_index] = sorted_bitree[2*del_node_index]; del_node_index *=2;}sorted_bitree[del_node_index] = -1;printf("last_index:%d\n", *last_index);}else{//移动到左孩子的右孩子del_node_index = del_node_index*2 + 1;while (2*del_node_index <= *last_index){del_node_index *= 2;}//因为叶子节点,所以不需要移动printf("r:%d rp:%d\n", sorted_bitree[i], sorted_bitree[del_node_index]); sorted_bitree[0] =sorted_bitree[del_node_index]; sorted_bitree[del_node_index] = -1;}}[2002] 对以二叉链表存储的非空二叉树,从右向左依次释放所有叶子结点,释放的同时,把结点值存放到一个向量中。

要求:( 1)用文字写出实现上述过程的基本思想. (2)写出算法*/keyType XL[MAX];Int iTmp=0;void Ani_PreTravel(BiTree &T){if(T){if((T ->lchild == NULL) && (T ->rchild == NULL)){XL[iTmp++] == T ->data;free(T);T = NULL;}else{Ani_PreTravel(T ->rchild);Ani_PreTravel(T ->lchild);}}}[2002] 设二叉排序树已经以二叉链表的形式存储在内存中,使用递归方法,求各结点的平衡因子并输出。

要求:(1) 用文字写出实现上述过程的基本思想。

(2) 写出算法*/(1)分别求出左子树与右子树的深度,二者之差即为该结点的平衡因子。

(2)//递归求二叉树的深度int Depth(_PNode pNode){if (NULL != pNode){int ld = Depth(pNode ->left);int rd = Depth(pNode ->right);return ld > rd ? ld + 1: rd + 1;}return 0;}//递归求二叉树每个结点的平衡因子void Balance(_PNode pNode){if (NULL != pNode){Balance(pNode ->left);Balance(pNode ->right);int hl = Depth(pNode ->left);int hr = Depth(pNode ->right);pNode->bf = hl - hr;print(pNode ->bf);// 输出各节点的平衡因子}}[2003] 三、给出中序线索二叉树的结点结构,试编写在不使用栈和递归的情况下先序编历中序线索二叉树的算法。

*/ 不懂!!!!!!!!!!!!!!void InTraveseThr(BitTree thrt){// 遍历中序线索二叉树p = thrt ->lchild; //p 指二叉树根结点while (p!=thrt){while(p ->Ltag == 0)p = p->lchild;printf(p ->data);while(p ->rtag == 1 && p ->rchild != thrt){p = p->rchild; printf(p ->data);}//whilep = p->rchild;}//while}//InTraversethr[2005] 设二叉树中结点的数据域的值互不相同,试设计一个算法将数据域值为X 的结点的所有祖先结点的数据域打印出来。

// 算法采用前序遍历的递归算法,在典型的遍历算法的参数表中增加了x,path[] ,level。

X代表要找的值;path[] 记录从根到含有x 节点的路径上所有的祖先节点,容量为maxsize,已经由#define 声明;level 传递当前访问节点的层次,初始值为1,用n 来记录祖先节点的个数int findAncestors(BTNode *t,char x,char path[],int level,int &n){ if(t!=NULL){path[level -1]=t ->data;if(t ->data==x){n=level;return 1;}if(findAncestors(t ->lchild,x,path,level+1,n)){return 1;}return findAncestors(t ->rchild,x,path,level+1,n);}else{return 0;}}[2006] 设二叉树二叉链表为存储结构,编写计算二叉树tree 中所有节点的平衡因子,同时返回二叉树tree 中非叶结点个数的算法与2002 年一样,只是加上非叶结点个数。

[2007] 设有n 个结点的平衡二叉树的每个结点都标明了平衡因子b, 设计结点存储结构,并编写求平衡二叉树的高度的算法//结点存储结构为typedef struct BTNode{int data;// 顶点信息int bf;// 顶点的平衡因子struct BTNode *lchild;struct BTNode *rchild;};int BalanceDepth(BTNode *bt){int level=0;// 代表节点层数BTNode *p;p=bt;while(p){level+=1;if(p->bf>0){// 如果当前结点的平衡因子是正数,则说明左子树高p=p->lchild;}else{// 如果为负数,说明右子树高,如果为零,则左右子树一样高p=p->rchild;}}return level;// 返回该平衡二叉树的高度}[2009] 设某二叉树以二叉链表为存储结构,设计算法将二叉树中各结点的左右孩子位置互换。

*/方法一:可以用二叉树后序递归遍历框架来解此题,即对当前树的左子树进行交换,再对右子树进行交换,最后交换整棵树(从底部到上面)void swap(BTNode *bt){if(b!=NULL){swap(b->lchild);swap(b->rchild);BTNode *temp=b->lchild;b->lchild=b->rchild;b->rchild=temp;}}方法二:先序遍历//这种通过返回树的方式,比较简便,可以借鉴BTree *Exchange(BTree *p)// 将p 指针指向的二叉树的左右子树进行互换。

{BTree *r;// 定义一个指针,用来交换左右子树if(p != NULL)// 交换p 结点的左右孩子{k++;r= p->lc;p->lc = p->rc;p->rc = r;p->lc = Exchange(p->lc);p->rc = Exchange(p->rc);}return(p);}//这种方式,如果指针需要变化,需要在开始用BTree *s=p; 指向树的指针需要进行替换,或者用引用型void Exchange(BTree *s)// 将s 指针指向的二叉树的左右子树进行互换。

{BTree *r;if(s != NULL)// 交换p结点的左右孩子{r= s->lc;s->lc = s->rc;s->rc = r;Exchange(s->lc);Exchange(s->rc);}}[2009] 已知一棵二叉树的前序序列和中序序列分别存于两个一维数组中,试编写算法建立该二叉树的二叉链表。

相关文档
最新文档