题目描述如下:
这个题在mooc上的浙大版数据结构中有比较详细的讲解,不过我自己也是作死,总想逞强自己做,做了半个下午才做出来,不过思路挺像。
这个题的主题部分就在于检查如何实现。这里采用的是:先用标准序列把标准的二叉搜索树建立起来,然后通过查找来排除后面的序列。打个比方:标准树是3 1 4 2(按这个顺序进行建树),并且按照顺序进行查找,那么我每次查找的时候肯定都访问过上一个数。而如果我按3 2 4 1的顺序进行查找(树是按照3 1 4 2建立的),就会发现当我查找2的时候,必须先经过1,但是1还没有被访问过,如果是同一棵树的话,这种情况是肯定不会发生的。
所以就有了大概思路。然后再想一下整个程序框架是怎么样的。1.建立一个class,来表示二叉搜索树。2.按照题目给出的格式处理输入,在这里我处理输入的方式是这样的:用一个三维数组来表示。比如说按图中的格式输入,处理后的结果是这样的:[[[3,1,4,2],[3,4,1,2],[3,2,4,1]],[[2,1],[1,2]]]。
python代码如下:
#获得输入
def inp():
k = [int(x) for x in input().split()]
if k[0] == 0:
return False
if k[0]!=0:
le = int(k[0])
num = int(k[1])
lis = []
for i in range(num+1):
lis.append([int(x) for x in input().split()])
return lis
#把输入给格式化,获得一个三维数组[多个树[多组序列[序列]]]
def get_inp():
trs = []
a = inp()
while a:
trs.append(a)
a = inp()
return trs
然后就是核心部分,检查序列。我的思路是这样的:每次检查一个数,如果通过返回True,通不过就返回False。然后通过一个for循环遍历检查一个序列,一旦有一个数通不过就跳出循环,并且表示这个序列不行。
以下是python代码:
#每次检查最内层数组的一个值
def check(root,tar):
if not root:
return False
if tar == root.data:
root.flag = 1
return True
if tar > root.data:
if not root.flag:
return False
return check(root.right,tar)
if tar < root.data:
if not root.flag:
return False
root.flag = 1
return check(root.left,tar)
def main():
k = get_inp()
for tree_list in k:
for tree_child_list in tree_list[1:]:
st = build(tree_list[0])
si = 1 #si代表这个序列的正确性,默认为1。
for x in tree_child_list:
if not check(st,x):
si = 0 #一旦不正确si置为0,跳出循环。
break
if si:
print('Yes')
else:
print('No')
最后一步就是调用main()运行程序。
当然,创建class的时候需要增加一项flag,用来标记当前节点是否被查找过,默认为0。
class tr(object):
def __init__(self,data=None):
self.right = None
self.left = None
self.data = data
self.flag = 0
end..