leetcode第100题,典型的二叉树的问题,判断两个数是否为相同的二叉树,要求节点数据和树的结构必须完全相同。
一开始考虑的是进行树的遍历,因为二叉树的前序遍历加上中序遍历或者后序遍历加上中序遍历可以唯一确定二叉树结构,因此考虑先进行两种遍历,然后比较结果就行了。但是这样做有一个bug,那就是如果元素相同,就无法区分元素是在哪个节点上了,这样一来,遍历结果就不能确定结果了。
贴上这种笨办法的代码
def isSameTree( p, q):
"""
:type p: TreeNode
:type q: TreeNode
:rtype: bool
"""
if p == None and q == None:
return True
if (p == None and q!=None) or (p!=None and q == None):
return False
def in_Order(root,l):
if root.left != None:
in_Order(root.left,l)
if root.val == None:
l.append(0)
else:
l.append(root.val)
if root.right != None:
in_Order(root.right,l)
def pre_Order(root,l):
if root.val == None:
l.append(0)
else:
l.append(root.val)
if root.left != None:
pre_Order(root.left,l)
if root.right != None:
pre_Order(root.right,l)
def campare(l1,l2):
n1 = len(l1)
n2 = len(l2)
if n1 != n2:
return False
for i in range(n1):
if l1[i] == l2[i]:
continue
else:
return False
return True
preOrder1 = []
inOrder1 = []
preOrder2 = []
inOrder2 = []
in_Order(p,inOrder1)
in_Order(q,inOrder2)
pre_Order(p,preOrder1)
pre_Order(q,preOrder2)
if campare(inOrder1,inOrder2) and campare(preOrder1,preOrder2):
flag = True
else:
flag = False
return flag
既然如此,采取另一种方法,一边递归遍历,一边进行比较,这样就可以确保能够完全相同了。
这样做相当于是两棵树进行深搜,需要一定的技巧,首先对两棵树搜索,输入参数肯定就是两棵树的节点,上来先判断两棵树都是空树的情况。而后进行深搜,搜索时先比较节点的值是否相等,如果不等就直接返回False,如果相等继续向下遍历。
要注意的是,有时候有点节点是空的,这时候需要用到hasattr函数,确保该节点有值的属性,如果没有,这说明结构已经不一样了,就可以直接返回False了。
# 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 isSameTree(self, p, q):
"""
:type p: TreeNode
:type q: TreeNode
:rtype: bool
"""
if not (p or q):
return True
elif (hasattr(p, 'val') and hasattr(q, 'val')) and p.val == q.val:
if self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right):
return True
else:
return False
else:
return False