一、题目描述
给你两棵二叉树的根节点 p
和 q
,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
二、解题思路过程
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
# 此算法与第24第思路类似,重复内容不再标注,如有不懂请查看第24题:二叉树的中序遍历
class Solution:
def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:
def stack(s,color,node):
s.append((green,node))
s.append((yellow,node.right))
s.append((yellow,node.left))
yellow,green=0,1
p_s=[(yellow,p)]
q_s=[(yellow,q)]
while p_s or q_s: # 如果ps和qs同时为空,则退出循环
if not (p_s and q_s): return False # 如果ps和qs只有一个为空,说明这两个二叉树不相等,直接返回False
pcolor,pnode=p_s.pop()
qcolor,qnode=q_s.pop()
if pnode is None and qnode is None: continue # 如果两个指针同时为空,则退出执行下一次循环
elif pnode is None or qnode is None: return False # 如果两个指针仅有一个为空,则说明这两个二叉树不相等,直接返回False
if pcolor == qcolor:
if pcolor == yellow:
stack(p_s,pcolor,pnode)
stack(q_s,qcolor,qnode)
elif pcolor == green:
if pnode.val != qnode.val: # 如果两个指针指向的值不相等,则直接返回False
return False
else: # 如果两个指针指向的元素颜色不相等,则直接返回False
return False
return True
三、复杂度分析
时间复杂度:,n为两个树的最小深度
空间复杂度:,n为两个树的节点个数
四、题目来源
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/same-tree