leetcode第572题——判断一棵树是不是另外一棵树的子树

1.题目描述

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

给定的树 s:

     3
    / \
   4   5
  / \
 1   2

给定的树 t:

   4 
  / \
 1   2

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

给定的树 s:

     3
    / \
   4   5
  / \
 1   2
    /
   0

给定的树 t:

   4
  / \
 1   2

返回 false。

2.分析

  • 2.1 先知道如何判断两棵树是否相等
    相等的条件:
    1.两棵树根结点相等
    2.并且s的左子树=t的左子树
    3.并且s的右子树=t的右子树

  • 2.2 再判断t是否属于s的子树
    t为s子树的条件:
    1.两棵树相等
    2.t是s的左子树
    3.t是s的右子树

3.python代码示例

class TreeNode:
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None


class Solution:
    def is_subtree(self, s: TreeNode, t: TreeNode):
        """
        判断t是否是s的子树
        判断条件:
            1.s和c_tree相等
            2.或t是s的左子树
            3.或t是s的右子树
        """
        if s is None and t is None:
            return True
        if s is None or t is None:
            return False
        return self.is_same(s, t) or self.is_subtree(s.left, t) or self.is_subtree(s.right, t)

    def is_same(self, s: TreeNode, t: TreeNode):
        """
        判断两棵树是否相等
        判断条件:
            1.根结点相等
            2.且s的左子树=t的左子树
            3.且s的右子树=t的右子树
        """
        if s is None and t is None:
            return True
        if s is None or t is None:
            return False
        return s.val == t.val and self.is_same(s.left, t.left) and self.is_same(s.right, t.right)


# 测试
s = TreeNode(4)
s.left = TreeNode(2)
s.left.left = TreeNode(1)
s.left.right = TreeNode(3)
s.right = TreeNode(9)
s.right.left = TreeNode(7)
s.right.left.left = TreeNode(6)
s.right.left.right = TreeNode(8)
s.right.right = TreeNode(10)
# s树结构
#         4
#      /      \
#    2         9
#  /   \     /
# 1     3   7
#         /  \
#        6    8


# t树结构
#         4
#      /      \
#    2         9
#  /   \     /
# 1     3   7
#         /  \
#        6    8
t = TreeNode(4)
t.left = TreeNode(2)
t.left.left = TreeNode(1)
t.left.right = TreeNode(3)
t.right = TreeNode(9)
t.right.left = TreeNode(7)
t.right.left.left = TreeNode(6)
t.right.left.right = TreeNode(8)
t.right.right = TreeNode(10)

d = TreeNode(7)
d.left = TreeNode(6)
d.right = TreeNode(8)
#   7
#  / \
# 6   8
result1 = Solution().is_same(s, t)
result2 = Solution().is_subtree(s, d)
print(result1)  # True
print(result2)  # True
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值