题目:
对于两棵彼此独立的二叉树A和B,请编写一个高效算法,检查A中是否存在一棵子树与B树的拓扑结构完全相同。
给定两棵二叉树的头结点A和B,请返回一个bool值,代表A中是否存在一棵同构于B的子树。
两种方法:
1.将两个子树A,B按照同样的遍历方式(前序,后序,中序)序列化成字符串strA,strB。判断strB是否被strA包含。
2.迭代。
方法一代码:
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class IdenticalTree:
def chkIdentical(self, A, B):
# write code here
if A==None or B==None:
return False
strA=self.pre(A)
strB=self.pre(B)
if strB in strA:
return True
else:
return False
def pre(self,root):
res=''
if root==None:
return '#!'
res+=str(root.val)+'!'
res+=self.pre(root.left)
res+=self.pre(root.right)
return res
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def isSubtree(self, A, B): #用于判断的主函数,递归得遍历A的每一个结点,并将其作为新的根节点,再与B进行比较
"""
:type s: TreeNode
:type t: TreeNode
:rtype: bool
"""
if not A:
return False
return self.isEqual(A,B) or self.isSubtree(A.left,B) or self.isSubtree(A.right,B)
#使用or相连,即其中只要有一个s的子树与t相同,则返回True
def isEqual(self,S,T): #以S为根节点,判断S和T是否相等
if not S and not T:
return True
if S and T:
if S.val!=T.val:
return False
return self.isEqual(S.left,T.left) and self.isEqual(S.right,T.right)
else:
return False