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

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

这个题在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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值