剑指Offer(Python多种思路实现):树的子结构
面试26题:
题目:树的子结构
题:输入两棵二叉树A和B,判断B是不是A的子结构。
解题思路一:递归,注意空指针的情况。
class Solution:
def HasSubtree(self, pRoot1, pRoot2):
# write code here
res=False
if pRoot1 and pRoot2:
if pRoot1.val==pRoot2.val:
res=self.SubtreeCore(pRoot1,pRoot2)
if not res:
res=self.HasSubtree(pRoot1.left,pRoot2)
if not res:
res=self.HasSubtree(pRoot1.right,pRoot2)
return res
def SubtreeCore(self,pRoot1,pRoot2):
if pRoot2==None:
return True
if pRoot1==None:
return False
if pRoot1.val!=pRoot2.val:
return False
return self.SubtreeCore(pRoot1.left,pRoot2.left) and self.SubtreeCore(pRoot1.right,pRoot2.right)
解题思路二:
def is_subtree(s: 'TreeNode', t: 'TreeNode') -> 'bool':
def is_same(s, t):
if s and t:
equal = s.val==t.val
if not t.left and not t.right:
return equal
else:
return (equal and is_same(s.left, t.left) and
is_same(s.right, t.right))
else:
return s is t
stack = s and [s]
while stack:
node = stack.pop()
if node:
res = is_same(node, t)
if res:
return True
stack.append(node.right)
stack.append(node.left)
return False