当前位置:网站首页>LeetCode #101. 对称二叉树
LeetCode #101. 对称二叉树
2022-08-09 11:43:00 【张楚明ZCM】
方法一:递归
对称意味着整个二叉树的左右字数也是对称的。
那么将左子树的左节点与右子树的右节点比较,左子树的右节点与右子树的左节点比较,如果这样的结构下,每一个节点都相等,则该二叉树对称。中间只要有一个不相等,则一定不对称。
利用递归的方法,同步移动左右子树的指针,左子树左移时,右子树右移,反之亦然。每次检查两指针的值是否相等,全部相等则返回True,中间只要不等就返回False。
class Solution:
def isSymmetric(self, root: Optional[TreeNode]) -> bool:
return self.compare(root.left, root.right)
def compare(self, p: Optional[TreeNode], q:Optional[TreeNode]) -> bool:
if p == None and q == None:
return True
if p == None or q == None:
return False
if p.val != q.val:
return False
else:
return self.compare(p.left, q.right) and self.compare(p.right, q.left)
复杂度分析
时间复杂度:
空间复杂度:
完整测试代码
from typing import Optional
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def isSymmetric(self, root: Optional[TreeNode]) -> bool:
return self.compare(root.left, root.right)
def compare(self, p: Optional[TreeNode], q:Optional[TreeNode]) -> bool:
if p == None and q == None:
return True
if p == None or q == None:
return False
if p.val != q.val:
return False
else:
return self.compare(p.left, q.right) and self.compare(p.right, q.left)
class main:
a = Solution()
node1 = TreeNode(1)
node2 = TreeNode(2)
node3 = TreeNode(2)
node4 = TreeNode(3)
node5 = TreeNode(4)
node6 = TreeNode(4)
node7 = TreeNode(3)
node1.left = node2
node1.right = node3
node2.left = node4
node2.right = node5
node3.left = node6
node3.right = node7
b = a.isSymmetric(node1)
print(b)
if __name__ == '__main__':
main()
方法二:迭代
先设置一个列表,将二叉树根节点root入队两次。每次从队列中提取两个结点进行比较,为空则跳过,不同则返回False。然后将下一层的结点加入比较。加入新一层的结点时注意将两个结点的左右子节点按照相反的顺序入队。
如此重复,中间只要有不相等就返回False,循环遍历完成都相等则返回True。
class Solution:
def isSymmetric(self, root: Optional[TreeNode]) -> bool:
queue = [root, root]
while queue:
p, q = queue.pop(), queue.pop()
if not p and not q:
continue
if not p or not q:
return False
if p.val != q.val:
return False
queue.append(p.left)
queue.append(q.right)
queue.append(p.right)
queue.append(q.left)
return True
复杂度分析
时间复杂度:
空间复杂度:
边栏推荐
猜你喜欢
随机推荐
字节秋招二面把我干懵了,问我SYN报文什么情况下会被丢弃?
[Essence] Analysis of the special case of C language structure: structure pointer / basic data type pointer, pointing to other structures
专业人士使用的 11 种渗透测试工具
拍频造成的轻微震荡
PTA 实验7-5 输出大写英文字母(10 分)
The use of signal function (signal) in C language
wpf实现简易画板功能(带截取画板,签名截图等等)
[C language] creation and use of dynamic arrays
mysql参数学习----max_allowed_packet
链表基本操作(详解)
Open3D point cloud average point spacing evaluation
TIC2000系列处理器在线升级
proto3-2 syntax
字符串 | 反转字符串 | 双指针法 | leecode刷题笔记
"Digital Economy Panorama White Paper" Special Analysis of Banking Industry Intelligent Marketing Application Released
OC-块对象
在北京参加UI设计培训到底怎么样?
mysql参数配置学习----临时表内存表的设置
F280049库函数API编程、直接寄存器控制编程和混合编程方法
ECCV 2022 Oral | CCPL: 一种通用的关联性保留损失函数实现通用风格迁移