给定两个二叉树,编写一个函数来检验它们是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例 1: 输入: 1 1 / \ / \ 2 3 2 3 [1,2,3], [1,2,3] 输出: true
示例 2: 输入: 1 1 / \ 2 2 [1,2], [1,null,2] 输出: false
示例 3: 输入: 1 1 / \ / \ 2 1 1 2 [1,2,1], [1,1,2] 输出: 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 """ pnodes=[] qnodes=[] self.edgoictree(p,pnodes) self.edgoictree(q,qnodes) while len(pnodes)>0 and len(qnodes)>0 : if pnodes.pop()!=qnodes.pop() : return False if len(pnodes)==0 and len(qnodes)==0: return True else: return False def edgoictree(self,binetree,pre_order_nodes): if binetree is None: pre_order_nodes.append('null') #注意空值要加入null return pre_order_nodes.append(binetree.val) self.edgoictree(binetree.left,pre_order_nodes) self.edgoictree(binetree.right,pre_order_nodes)
思路二:同时遍历两个树,递归完后立即比较。
# Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def isSameTree(self, p, q): """ :type p: TreeNode :type q: TreeNode :rtype: bool """ if not p and not q: #两二叉树皆为空,递归边界,两者皆为空返回真 return True if p and q and p.val==q.val: l=self.isSameTree(p.left,q.left) #递归,每次重新从函数入口处进行,每次进行递归边界判断 r=self.isSameTree(p.right,q.right) return l and r #and操作,需要l与r皆为true时,才返回真。只用最后一次递归边界return值 else: return False