0 题目描述
leetcode原题链接:剑指 Offer 28. 对称的二叉树
1 递归解法
对称二叉树定义: 对于树中 任意两个对称节点
L
L
L 和
R
,
R,
R, 一定有:
-
L
.
v
a
l
=
R
.
v
a
l
:
L . v a l=R . v a l:
L.val=R.val: 即此两对称节点值相等。
-
L
.
l
e
f
t
.
v
a
l
=
R
.
r
i
g
h
t
.
v
a
l
L.left.val = R.right.val
L.left.val=R.right.val: 即
L
L
L 的左子节点 和
R
R
R 的右子节点对称;
-
L
.
r
i
g
h
t
.
v
a
l
=
R
.
l
e
f
t
.
v
a
l
L.right.val = R.left.val
L.right.val=R.left.val : 即
L
L
L 的佑子节点 和
R
R
R 的左子节点对称。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def isSymmetric(self, root: TreeNode) -> bool:
return self.judge(root, root)
def judge(self, left: TreeNode, right: TreeNode)-> bool:
if not left and not right: return True
if not left or not right: return False
if left.val != right.val: return False
return self.judge(left.left, right.right) and self.judge(left.right, right.left)
复杂度分析:
时间复杂度
O
(
N
)
O(N)
O(N) : 其中 N 为二叉树的节点数量,每次执行 judge() 可以判断一对节点是否对称,因此最多调用 N/2 次 judge() 方法。
空间复杂度
O
(
N
)
O(N)
O(N): 最差情况下,二叉树退化为链表,系统使用
O
(
N
)
O(N)
O(N) 大小的栈空间。
参考资料
面试题28. 对称的二叉树(递归,清晰图解)