获,成长。
废话不多说,又遇到二叉树相关的题,题目虽简单,但用到些经典思路,所以记录下:
判断两个二叉树是否相等
class Node():
def __init__(self,val,left=None,right=None):
self.val = val
self.left = left
self.right = right
def IsSame(self, node):
#以上为题干部分, 下面采用先根序遍历(复杂度O(n)=2n)的方法来实现:
p, q = self, node
S0 = [] #栈0
S1 = [] #栈1
while (p and q) or len(S0):
if p and q:
if p.val != q.val:
return False
S0.append(p.right) #存右置左
p = p.left
S1.append(q.right)
q = q.left
p = S0.pop()
q = S1.pop()
if (p and (not q))or((not p)and q): #有一个不为None
return False
return True
其实一开始我也写错了,而且没测,是发出后才知,非常尴尬...错在对象方法中用了递归方法,然后出现回调问题。(NoneType不能通过self调用IsSame方法),这个思路没问题,但须用外函数写才行:
def IsSame(a, b): #外函数递归方法
'''如有空树的情况'''
if (not a)and(not b): #都为None
return True
if (not a) or (not b): #有一个不为None
return False
if a.val != b.val:
return False
return IsSame(a.left, b.left)and IsSame(a.right, b.right)
#以下为测试过程
if __name__ == '__main__':
# 手动创建一课二叉树
tree = Node(1,None,None)
tree.left = Node(2, None, None)
tree.right = Node(3, None, None)
tree.left.left = Node(4, None, None)
tree.left.right = Node(5, None, None)
tree.right.left = Node(6, None, None)
tree.right.right = Node(7, None, None)
tree.left.left.left = Node(8, None, None)
tree.left.left.right = Node(9, None, None)
tree.left.right.left = Node(10, None, None)
tree.left.right.left.right = Node(11, None, None)
print("手动创建一个二叉树tree\n再创建同样一个tree0")
tree0 = Node(1,None,None)
tree0.left = Node(2, None, None)
tree0.right = Node(3, None, None)
tree0.left.left = Node(4, None, None)
tree0.left.right = Node(5, None, None)
tree0.right.left = Node(6, None, None)
tree0.right.right = Node(7, None, None)
tree0.left.left.left = Node(8, None, None)
tree0.left.left.right = Node(9, None, None)
tree0.left.right.left = Node(10, None, None)
tree0.left.right.left.right = Node(11, None, None)
print(tree.IsSame(tree0))
print(IsSame(tree,tree0))
两种方法都可以通过测试。
————欢迎转载,但请注明出处!