题目要求:请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
思路:先写处二叉树的镜像二叉树,然后再判断二者的前序遍历是否一致
踩过的坑:
1. 直接令mirror=root,然后让mirror的left指向root的right,结果发现root也跟着变化,可能是浅拷贝的原因,所以后来直接就重新构建了一个二叉树的类;
2. 代码测试中竟然有一个所有节点数全一样,但不是完全二叉树的情况(即有的节点左右孩子不全),所以考虑到需要判断出左子树和右子树哪个为空,所以加了“#”的部分。一开始以为只要root.left和root.right有一个为空就可以append“#”,后来发现当节点是叶子节点时就会一下子加两个“#”所以就加了一个elif的判断条件
感觉这样还是很复杂,希望再刷的时候能有改进~
第一次代码:
class Solution:
def Formerlist(self, root,list_former):if root:
list_former.append(root.val)
if root.left:self.Formerlist(root.left,list_former)
elif root.right:
list_former.append('#')
if root.right:
self.Formerlist(root.right,list_former)
elif root.left:
list_former.append('#')
def Mirror(self, root,list_node):
if root:
mirror=TreeNode(root.val)
list_node.append(mirror.val)
if root.right:
mirror.left = root.right
self.Mirror(root.right,list_node)
elif root.left:
list_node.append('#')
if root.left:
mirror.right = root.left
self.Mirror(root.left,list_node)
elif root.right:
list_node.append('#')
def isSymmetrical(self, pRoot):
# write code here
list_node = []
list_former = []
mirror_root = self.Mirror(pRoot,list_node)
self.Formerlist(pRoot,list_former)
if list_node == list_former:
return True
else:
return False