数据结构系统回顾与总结(3)(判断是否为同一棵二叉搜索树)

来源:互联网 发布:直销返利系统源码 编辑:程序博客网 时间:2024/06/07 05:13

题目描述如下:
这里写图片描述
这里写图片描述

这个题在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..

阅读全文
0 0
原创粉丝点击