572. 另一个树的子树(Python)

题目

难度:★☆☆☆☆
类型:二叉树

给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。

题目

示例 1:
给定的树 s:

     3
    / \
   4   5
  / \
 1   2

给定的树 t:

   4
  / \
 1   2

返回 true,因为 t 与 s 的一个子树拥有相同的结构和节点值。

示例 2:
给定的树 s:

     3
    / \
   4   5
  / \
 1   2
    /
   0

给定的树 t:

   4
  / \
 1   2

返回 false。

解答

这是树的一个基础题,判断一棵树是否是另一棵的子树,通过前序遍历的结果是否存在包含关系实现。

class Solution:
    def isSubtree(self, s, t):
        def pre_order(root, res):
            """
            获得二叉树的前序遍历结果
            :param root:  二叉树根节点
            :param res: 结果存储列表
            :return:
            """
            if root:                            # 如果当前节点不为空
                res.append(str(root.val))       # 添加当前结点的值
                pre_order(root.left, res)       # 左子树的前序遍历
                pre_order(root.right, res)      # 右子树的前序遍历
            else:                               # 如果当前结点为空
                res.append('#')                 # 用“#”代替

        s_list, t_list = [], []                 # 序列化结果存储器
        pre_order(s, s_list)                    # 获取s的前序遍历结果
        pre_order(t, t_list)                    # 获取t的前序遍历结果
        # print(','.join(t_list))
        # print(','.join(s_list))
        # 将列表转为字符串进行比较,前端加“,”防止出现“2,#,#”in“12,#,#”中的情况
        return ','+','.join(t_list) in ','+','.join(s_list)

同样,我们可以考虑使用元组精简上述复杂的前序遍历流程:

class Solution:
    def isSubtree(self, s, t):
        # 这个函数把树序列化为一个元组
        toTup = lambda n: (n.val, toTup(n.left), toTup(n.right)) if n else None
        # 把元组转化为字符串以方便比较
        return str(toTup(t)) in str(toTup(s))

如有疑问或建议,欢迎评论区留言~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • B树的定义 一棵m阶的B树满足下列条件: 树中每个结点至多有m个孩子。 除根结点和叶子结点外,其它每个结点至少有m...
    文档随手记阅读 13,469评论 0 25
  • 树的定义与基本术语   树型结构是一类重要的非线性数据结构,其中以树和二叉树最为常用,是以分支关系定义的层次结构。...
    java技术分享师阅读 1,159评论 0 1
  • 2019 iOS面试题大全---全方面剖析面试2018 iOS面试题---算法相关1、七种常见的数组排序算法整理(...
    Theendisthebegi阅读 10,453评论 0 17
  • 有的时候前辈能给你关于未来的忠告,因为那是他们曾经经历过的过去。 有的时候自己能给自己关于方向的指引,因为那是最初...
    O布布O阅读 178评论 0 1
  • 简介:想要做一个前后端分离的管理系统(Vue+tp5),网上找了很多有关VueThink是一套基于Vue全家桶(V...
    果Z阅读 207评论 0 0