这门课程是我2019年下半年学的,老师很棒,讲得容易理解,讨论区的问题基本上老师都会回复,通过这门课程学到了许多东西,十分感谢老师。在这里把我之前期末考试的代码和注释发上来,当做一个保存和纪念吧,同时方便对将来刚学这门课的同学参考吧_

1二叉树路径(10分)

题目内容:

给定一个二叉查找树的节点插入顺序,请重新构建这个二叉查找树,并按从左至右顺序返回所有根节点至叶节点的路径

输入格式:

一行整数,以空格分隔

注:测试用例中不包含重复的数字

输出格式:

按照叶节点由左至右顺序,以“根节点值->节点值->…->叶节点值”输出每条路径,每行输出一条

输入样例:

5 2 6 1 3 7 4

输出样例:

5->2->1

5->2->3->4

5->6->7

注:对应的二叉查找树如下图:

数据结构 课程设计 Python版 数据结构python版期末_中序遍历

答案:

#考察的知识点:

1.二叉查找树的实现及填充(递归)

2.二叉查找树的中序遍历(递归)

3.寻找叶节点的所有祖先并按格式输出(递归)

#步骤:

1.定义节点类,以及它要用到的属性

2.根据输入内容填充二叉查找树

3.把是叶节点的按照小到大的顺序取出来:保证顺序就要用到中序遍历

4.分别对这些叶节点输出它们的祖先

lst = input().split(' ')
lst = [int(x) for x in lst]
class Node:
def __init__(self,key):
self.key = key
self.leftChild = None
self.rightChild = None
self.father = None
def insert(node,x): #bst插入的方法
if x.key < node.key:
if node.leftChild == None:
node.leftChild = x
x.father = node
else:
insert(node.leftChild,x)
else:
if node.rightChild == None:
node.rightChild = x
x.father = node
else:
insert(node.rightChild,x)
tree = Node(lst.pop(0))
for x in lst:
insert(tree,Node(x))
lst1 = []
def traversal(node): #中序遍历
if node.leftChild != None:
traversal(node.leftChild)
if node.leftChild == None and node.rightChild == None:
lst1.append(node)
if node.rightChild != None:
traversal(node.rightChild)
traversal(tree)
def findAncestor(x):
lst2.insert(0,x.key)
if x.father != None:
findAncestor(x.father)
if x.father == None:
print('->'.join(str(x) for x in lst2))
for x in lst1:
lst2 = []
findAncestor(x)


2入室抢劫(10分)

题目内容:

一个专业的小偷决定连夜搜刮沿街的房子。每间房都藏有一定的现金;但需要注意的是,这条街上相邻的房间都装有连通的报警系统,一旦相邻的房间同时被偷则会自动报警。请规划方案,使不触发报警器的前提下获得最大的收益。

输入格式:

一行非负整数序列,代表沿街每个房间的收益

输出格式:

一个整数,代表可能的最大收益

输入样例:

2 1 2 3

输出样例:

5

注:同时偷窃下标为 0(收益2)与 3(收益3)的房间,可以获得最大收益5

答案:

这道题跟递归(下)的编程题“铺瓷砖”是一种类型的题。

我感觉课程中用到的递归可以分成两种:

1.一种是简单一些的像树的遍历、二叉查找树添加新节点这种,递归函数是做一个动作,而没有返回值,所以也用不着记忆化字典。

2.一种是复杂一点的递归,有返回值,所以要倒腾清楚递归各步骤执行的先后顺序。一般有返回值的递归,需要设立记忆化字典。

本题思路:

分两种情况,先偷第一间或先偷第二间,然后不断间隔一间或两间偷(递归)。

lst = input().split(' ')
lst = [int(x) for x in lst]
#lst=[2,1,2,3,6,6,7] #用于测试,结果应该是17
dic = {} #记忆字典
def traversal(i): #该函数指从第i间开始偷,最多能偷多少钱。
if i == len(lst)-1: #前三个if是基本结束条件
return lst[i]
if i == len(lst)-2:
return lst[i]
if i == len(lst)-3:
return lst[i] + lst[i+2]
if i in dic: #如果在记忆字典的话直接用。
return dic[i]
else:
sumMoney = lst[i]
chose1 = traversal(i+2)
chose2 = traversal(i+3)
sumMoney += max(chose1,chose2)
dic[i] = sumMoney #将结果装入记忆字典
return sumMoney
print(max(traversal(0),traversal(1)))