专业考题解析交叉学科 · 清华美院 · 信息

「解题」2023清华大学交叉学科981信息技术基础真题剖析

2023-01-017 MIN READ原载于微信公众号 ↗

01

2023真题还原

02

真题解析

_1. 代码填空(35分)_

程序实现中缀转后缀

重载<运算符用来比较运算符优先级

输入:1-2*(3+4)

输出:1234+*-

答案

点击下方空白处获得答案

以下步骤将中缀表达式转换成后缀表达式。

代码思路如下:

  1. 创建一个空栈opstack,用于保持运算符。为输出创建一个空字符串。
  1. 从左到右扫描字符串。
  1. 如果字符是操作数,则将其附加到输出列表的末尾。
  1. 如果字符是左括号,请将其压栈入opstack。
  1. 如果字符是右括号,则弹出opstack直到遇到相应的左括号。并将每个弹出的运算符附加到输出字符串的末尾。
  1. 如果字符是操作符, \* , / , + 或  -  ,请将其入栈到 opstack。但是,首先弹出opstack上具有更高或相同优先级的任何运算符 ,并将这些运算符加到输出字符串。
  1. 扫描字符串完字符串后,检查 opstack。任何仍在堆栈上的运算符都可以删除并附加到输出字符串的末尾。

_2.编写程序设计银行储蓄账户(40分)_

1)先实现一个基类即账户类 实现存款 取款 账户信息等功能

2)根据账户类派生出 信用账户 储蓄账户。信用账户不用详细实现,储蓄账户需要详细实现,实现以月或年为单位的储蓄过程,计算利率

3)自行设计更多功能并实现

4)画出uml类图 表示类与类之间的关系 测试此程序

【参考书上7.7.3 个人银行账户管理程序】

答案

点击下方空白处获得答案

一家银行有很多分行。在每个区域中,一个分支被指定为区域总部,负责监督该区域中的其他分支。每个分行可以有多个账户和贷款。帐户可能是储蓄账户或信用账户。客户可以打开储蓄账户和信用账户。但是,客户不得拥有多个储蓄账户或信用账户。客户还可以从银行采购贷款。

系统中的类:

银行,分行,账户,储蓄账户,经常账户,贷款和客户。

关系:

银行“拥有”分支数:组合,一对多

一个有角色区域总部的分公司监督其他分支机构:一元关联,一对多

一个分支机构拥有一个“多个帐户:聚合,一对多”

从账户基类中,继承了两个类,即储蓄账户和信用账户。

客户可以有一个信用账户:关联,一对一

客户可以有一个储蓄账户:关联,一对一

一个分支机构拥有“多少贷款:聚合”,一对多

客户可以多次贷款:关联,一对多

_3.判断对错 给出解释或证明 (6分一题, 共30分)_

(1) 在渐进复杂度中,对数复杂度的常数底会影响复杂度。

答案

点击下方空白处获得答案

False,算法时间复杂度为log(n)时,不同底数对应的时间复杂度的倍数关系为常数,不会随着底数的不同而不同,因此可以将不同底数的对数函数所代表的时间复杂度,当作是同一类复杂度处理,即抽象成一类问题。

(2) 所有叶子结点深度一致的二叉树为满树。

答案

点击下方空白处获得答案

False,所有叶子结点深度一致代表所有叶子结点深度在同一层上。但是不能代表非叶结点的度一定为2,也可能存在度为1的非叶结点,此时不符合满树的特征。

比如  A ,此时只有一个叶节点B,但是该树不是满树。

/

B

(3) 深度优先搜索能用于判断有向图的回路。

答案

点击下方空白处获得答案

True,深度优先搜索(DFS:Depth-First Search)和拓扑排序可以用于检测图中是否存在环。

(4) 某个队列允许一端入队两端出队,入队过程中可以出队,则当入队顺序为ABCDE时不可能得到EBCAD的出队顺序。

答案

点击下方空白处获得答案

True,注意到出队顺序的第一个字母为E,而E是入队顺序的最后一个字母,也就是说在E出队前没有任何元素出队。即入队过程中没有元素出队。全部元素入队后开始出队,注意到出队顺序第二个元素是B,而B在入队顺序中位于A和C的中间,因此B元素不可能同时先于AC出队。

(5) 中序遍历二叉搜索树得到的序列是单调非降的。

答案

点击下方空白处获得答案

True, 二叉搜索树一个很重要的特性就是:树中任何结点的左子树中所有结点的值均比该结点小,右子树中所有结点的值均比该结点大。对二叉搜索树进行中序遍历即得到一个单调非降的序列。同理,检查一个树是否是二叉搜索树可以使用中序遍历。

4.查找算法 (20分)

(1) 计算序列{2,3,4,6,7,8,9}二分查找的平均查找长度。

答案

点击下方空白处获得答案

首先根据二分查找的算法,将有序数组转换成二叉树搜索树的形式,然后每一层的数据的个数乘以所在层数后累加,最后除以数据数即可。

对于查找失败的平均查找长度来说,需要为所有的结点补充左右子结点。然后计算各层子结点数与层数乘积后的累加和,最后除以补充的子结点数即可。

(2) 改用散列表法,散列表 A[0,….10],哈希函数为 H(key)=(key^2+2) mod 11,采用链表法处理冲突,当查找顺序为{4,7,3,6,8,9,2}时,画出哈希表并计算平均查找长度。

答案

点击下方空白处获得答案

_5.二叉树算法 25分_

(1)已知前序序列和中序序列,画出二叉树,写出后序序列。

答案

点击下方空白处获得答案

做题思路:

最好的办法是,根据已经知道的前序和中序序列,画出二叉树即可根据后序遍历的口诀:左右根,求出后序遍历

那么问题来了,怎么画出二叉树的图呢??

其实简单,因为左右子树的中间被访问叫做中序,其顺序为左根右

我们将中序序列作为切入点,化为左右子节点,具体怎么做呢?

我们知道前序遍历时,都是先遍历根子节点,而中序遍历时先遍历左子节点的,所以左子节点一定是在根节点的左边,右子节点在根节点的右边,如下图

第一步: 根据前序遍历的根节点1(即根节点A)划分中序遍历的左右子节点

第二步: 根据前序遍历的根节点2(即根节点B)划分中序遍历的左右子节点

第三步: 根据前序遍历的根节点3(即根节点C)划分中序遍历的左右子节点,此时中序序列的C无左右子节点,B是它的父节点,如上图所示

第四步: 根据前序遍历的根节点4(即根节点D)划分中序遍历的左右子节点, 操作同上,如下图所示

第五步: 根据前序遍历的根节点5(即根节点E)划分中序遍历的左右子节点, 操作同上,如下图所示

第六步: 根据前序遍历的根节点6(即根节点F)划分中序遍历的左右子节点, 操作同上,如上图所示

第七步: 根据前序遍历的根节点7(即根节点G)划分中序遍历的左右子节点, 操作同上,如下图所示

…

重复以上步奏,得到最终的二叉树图如下

然后根据后序遍历:左右根

遍历得到:CBFEIJHGDA

(2)二叉树用二叉链表实现  查找前序遍历的第一个节点 设计算法 不用栈和递归实现 写出伪代码。

答案

点击下方空白处获得答案

前序遍历的第一个节点即根节点直接返回即可:

BiTreeNode *getFirstNodeUsingPreOrderTraverse(BiTree T)

{

if(NULL == T)

return NULL;

return T;

}

中序遍历的第一个节点即最左边的结点,因此一直向左孩子找,直到不能向左为止。此时的最左节点即中序遍历的第一个节点

BiTreeNode *getFirstNodeUsingInOrderTraverse(BiTree T)

{

if(NULL == T)

return NULL;

while(NULL != T->leftChild)

T = T->leftChild; //向左一路狂奔,直到不能向左为止

return T;

}


ABOUT US

本文原载于微信公众号,正文与配图已转存至本站以便长期访问。 查看原文 ↗

有想具体聊聊的问题?把你的情况说一说。

联系咨询