题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
思路
《剑指offer》P277
- 方法一:递归解法
先对根节点进行非空判断,然后判断左右子树是否互为镜像,具体做法是:递归地判断左子树的左孩子与右子树的右孩子值是否相等。 - 方法二:非递归
- 先对根结点进行非空判断,然后分别将左右子树放入一个
list
中。 - 每次去除两个结点,比较非空和值的情况,如果都为空,或者都不为空且值相等,则将位于镜像的结点成对放入
list
中,继续比较。
- 先对根结点进行非空判断,然后分别将左右子树放入一个
code
- 方法一:递归
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def isSymmetrical(self, pRoot):
# write code here
if not pRoot:
return True
return self.isSymmetricalTree(pRoot.left, pRoot.right)
def isSymmetricalTree(self, root1, root2):
if not root1 and not root2:
return True
if not root1 or not root2:
return False
if root1.val == root2.val:
return self.isSymmetricalTree(root1.left, root2.right) and self.isSymmetricalTree(root1.right, root2.left)
else:
return False
- 方法一:非递归
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def isSymmetrical(self, pRoot):
# write code here
if not pRoot:
return True
node_stack = []
if pRoot.left and pRoot.right:
node_stack.append(pRoot.left)
node_stack.append(pRoot.right)
while node_stack:
left = node_stack.pop(0)
right = node_stack.pop(0)
# 先判断非空
if not right and not left:
continue
if not right or not left:
return False
# 都非空,再判断值是否相等
if left.val !=right.val:
return False
node_stack.append(left.left)
node_stack.append(right.right)
node_stack.append(left.right)
node_stack.append(right.left)
return True