一开始打算利用递归遍历(根->左->右)和(根->右->左)结果是否相同来判断一颗二叉树是否是对称二叉树,但是一直存在漏洞;之后尝试结合三种遍历中的两种来做,发现仍然有漏洞。
最后想到的办法是将空节点也加入到结果列表中,成功解决。
# 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:
# 根左遍历,根右遍历,判断是否相同
if root == None:
return True
po_left = []
po_right = []
def PostOrder_left(root):
if root == None:
po_left.append(None)
return
po_left.append(root.val)
PostOrder_left(root.left)
PostOrder_left(root.right)
def PostOrder_right(root):
if root == None:
po_right.append(None)
return
po_right.append(root.val)
PostOrder_right(root.right)
PostOrder_right(root.left)
PostOrder_left(root)
PostOrder_right(root)
# print(po_left)
# print(po_right)
return po_left == po_right
第二种解法参考了力扣的画解算法101,同时输入两棵树A和B,判断A的左、右子树和B的右、左子树是否对称。
class Solution:
def isSymmetric(self, root: TreeNode) -> bool:
# 前序遍历两颗树
def two_tree(t1, t2):
# print('111')
if t1 == None and t2 == None:
return True
elif not t1 or not t2:
return False
else:
if t1.val == t2.val:
r1 = two_tree(t1.left, t2.right)
r2 = two_tree(t1.right, t2.left)
return r1 and r2
else:
return False
return two_tree(root, root)