如果兩個樹在結構上相同,並且節點具有相同的值,則認爲它們是相同的。
示例 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