题目:
Given two non-empty binary trees s and t, check whether tree t has exactly the same structure and node values with a subtree of s. A subtree of s is a tree consists of a node in s and all of this node's descendants. The tree s could also be considered as a subtree of itself.
Example 1:
Given tree s:
3 / \ 4 5 / \ 1 2Given tree t:
4 / \ 1 2Return true , because t has the same structure and node values with a subtree of s.
Example 2:
Given tree s:
3 / \ 4 5 / \ 1 2 / 0Given tree t:
4 / \ 1 2
Return false.
这道题我一开始的逻辑是这样的:
class Solution:
def isSubtree(self, s, t):
"""
:type s: TreeNode
:type t: TreeNode
:rtype: bool
"""
if not t and not s:
return True
if not s or not t:
return False
if t.val != s.val:
return self.isSubtree(s.left, t) or self.isSubtree(s.right, t)
else:
return (self.isSubtree(s.left, t.left) and self.isSubtree(s.right, t.right))
但是提交的时候在判断【1,1】和【1】这种树时出现了错误,误判成false,原因是,再判断完两个树的值相同时,直接向下遍历的左右子树,于是发现S==NULL,所以返回false。于是发现这种思路并不是很可取。不应该只考虑当前value在子树还没有着落的情况下就return了。后来参考了一些博客上写的C++代码,把思路调整为:判断该节点作为根节点的一整棵树是否完全相等。
class Solution:
def isSubtree(self, s, t):
"""
:type s: TreeNode
:type t: TreeNode
:rtype: bool
"""
def isSame(s, t):
if not t and not s:
return True
if not s or not t:
return False
if t.val == s.val:
return (isSame(s.left, t.left) and isSame(s.right, t.right))
else:
return False
if not t and not s:
return True
if not s or not t:
return False
if (t.val == s.val and isSame(s, t)):
return True
else:
return self.isSubtree(s.left, t) or self.isSubtree(s.right, t)
程序写的好丑==,过几天再想想