101. Symmetric Tree [easy] (Python)

来源:互联网 发布:mac epub mobi 转换 编辑:程序博客网 时间:2024/04/30 06:03

题目链接

https://leetcode.com/problems/symmetric-tree/

题目原文

Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).

For example, this binary tree is symmetric:

    1   / \  2   2 / \ / \3  4 4  3

But the following is not:

    1   / \  2   2   \   \   3    3

题目翻译

给定一个二叉树,判断它是否是自己的镜像(中心对称)。

思路方法

思路一

递归,对于每个节点,检查树的左右节点值是否相等,同时判断:左节点的左子树和右节点的右子树是否对称、右节点的左子树和左节点的右子树是否对称。

代码

# Definition for a binary tree node.# class TreeNode(object):#     def __init__(self, x):#         self.val = x#         self.left = None#         self.right = Noneclass Solution(object):    def isSymmetric(self, root):        """        :type root: TreeNode        :rtype: bool        """        if not root:            return True        return self.mirror(root.left, root.right)    def mirror(self, left, right):        if not left or not right:            return left == right        if left.val != right.val:            return False        return self.mirror(left.left, right.right) and self.mirror(left.right, right.left)

思路二

非递归算法。算是将上面的递归方法改写成非递归方法,实际上是深度优先搜索(DFS)。

代码

# Definition for a binary tree node.# class TreeNode(object):#     def __init__(self, x):#         self.val = x#         self.left = None#         self.right = Noneclass Solution(object):    def isSymmetric(self, root):        """        :type root: TreeNode        :rtype: bool        """        if not root:            return True        stackl, stackr = [root.left], [root.right]        while len(stackl) > 0 and len(stackr) > 0:            left = stackl.pop()            right = stackr.pop()            if not left and not right:                continue            elif not left or not right:                return False            if left.val != right.val:                return False            stackl.append(left.left)            stackl.append(left.right)            stackr.append(right.right)            stackr.append(right.left)        return len(stackl) == 0 and len(stackr) == 0

思路三

除了可以DFS,也可以BFS,直接上代码:

代码

# Definition for a binary tree node.# class TreeNode(object):#     def __init__(self, x):#         self.val = x#         self.left = None#         self.right = Noneclass Solution(object):    def isSymmetric(self, root):        """        :type root: TreeNode        :rtype: bool        """        if not root:            return True        queuel, queuer = [root.left], [root.right]        while len(queuel) > 0 and len(queuer) > 0:            left = queuel.pop()            right = queuer.pop()            if not left and not right:                continue            elif not left or not right:                return False            if left.val != right.val:                return False            queuel.insert(0, left.left)            queuel.insert(0, left.right)            queuer.insert(0, right.right)            queuer.insert(0, right.left)        return len(queuel) == 0 and len(queuer) == 0

PS: 新手刷LeetCode,新手写博客,写错了或者写的不清楚还请帮忙指出,谢谢!
转载请注明:http://blog.csdn.net/coder_orz/article/details/51579528

0 0
原创粉丝点击