二叉树问题---判断t1树中是否有与t2树拓扑结构完全相同的子树

本文介绍了如何判断一棵二叉树(t1)中是否存在另一棵树(t2)的拓扑结构完全相同的子树。方法包括:对t1的每个子树进行O(M)的时间复杂度检查,总复杂度O(M*N);以及将t1和t2序列化后利用KMP算法在O(M+N)时间复杂度内完成判断。
摘要由CSDN通过智能技术生成

说明:
两种方法:
方法1
对于t1的每棵子树,都去判断是否与t2树的拓扑结构完全一样,这个过程的实践复杂度是O(M),t1的子树共有N棵,所以时间复杂度为O(M*N)
方法2
首先把t1树和t2树按照先序遍历的方式序列化,之后用KMP算法去判断t2Str是否是t1Str的子串即可。t1的序列化的过程是O(N),t2的序列化是O(M),KMP算法解决匹配问题的复杂度是O(M+N),所以总体时间复杂度是O(M+N)

#方法1的实现
def isSubTopoBST2(t1, t2):
    def isTopoBST2(t1, t2):
        if not t1 and not t2:
            return True
        if not t1 or not t2 or t1.val != t2.val:
            return False
        return isTopoBST2(t1.left, t2.left) and isTopoBST2(t1.right, t2.right)

    if not t1 or not t2:
        return False
    return isTopoBST2(t1, t2) or isSubTopoBST2(t1.left, t2) or isSubTopoBST2(t1.right, t2)

#方法2的实现
def isSubTopoBST(t1, t2):
    def serialTreeByPre(root):
        if not root:
            return '#!'
        res = root.val + '!'
        res += serialTreeByPre(root.left)
        res += serialTreeByPre(root.right)
        return res

    def isTopoBST(s, m):
        if not s or not m or len(s) < len(m) or len(m) < 1:
            return False
        mi = 0
        si = 0
        nextarr = getNextArray(m)
        while mi < len(m) and si < len(s):
            if s[si] == m[mi]:
                mi += 1
                si += 1
            elif nextarr[mi] == -1:
                si += 1
            else:
                mi = nextarr[mi]
        if mi == len(m):
            return True
        else:
            return False

    def getNextArray(m):
        if len(m) == 1:
            return -1
        nextarr = [None for i in range(len(m))]
        nextarr[0] = -1
        nextarr[1] = 0
        pos = 2
        cn = 0
        while pos < len(m):
            if m[pos-1] == m[cn]:
                nextarr[pos] = cn + 1
                pos += 1
                cn += 1
            elif cn > 0:
                cn = nextarr[cn]
            else:
                nextarr[pos] = 0
                pos += 1
        return nextarr

    if not t1 or not t2:
        return False
    str1 = serialTreeByPre(t1)
    str2 = serialTreeByPre(t2)
    arr1 = str1.split('!')
    arr1.pop()
    arr2 = str2.split('!')
    arr2.pop()
    return isTopoBST(arr1, arr2)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值