leetcode#101. Symmetric Tree

description

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

For example, this binary tree [1,2,2,3,4,4,3] is symmetric:

    1
   / \
  2   2
 / \ / \
3  4 4  3
But the following [1,2,2,null,3,null,3] is not:
    1
   / \
  2   2
   \   \
   3    3
Note:
Bonus points if you could solve it both recursively and iteratively.

Thinking

没想到什么好方法,只想到了遍历一遍树,得到层序的序列,然后将序列根据每层的节点个数切片,对每个切片分析是否镜像对称。
一边写着代码,突然发现,不用得到最后序列再切片了。因为每次得到的是一层的序列,所以可以直接拿去判断了。

Code (iteratively)

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    serial = []
    def isSymmetric(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        if root == None:
            return True
        self.serial = [root.left, root.right]
        return self.getSerial()

    def getSerial(self):
        res = self.check()
        temp = []
        flag = False #标志一层内有无非空节点
        if res == False:
            return res
        else:
            for i in self.serial:
                if not i == None:
                    flag = True
                    temp += [i.left, i.right]
                else:
                    temp += [None, None]
            if flag == False: #这层全是空节点 
                return True
            self.serial = temp
            return self.getSerial()
    def check(self):
        length = len(self.serial)
        halfLen = length / 2
        i = 0
        while i <= halfLen:
            if self.serial[i] == None:
                if self.serial[length - i - 1] == None:
                    i += 1
                else:
                    return False
            elif self.serial[length - i - 1] == None:
                return False
            elif self.serial[i].val == self.serial[length - i - 1].val:
                i += 1
            else:
                return False
        return True

理论上,这段代码是对的。然后提交后发现超时,观察了下超时的用例,树有非常多层,而且存在了很多的空节点。由于我的代码中,对于空节点也是在下一层时拆成两个空节点来看的,所以越往下层,节点会越多。改进点那就是把空节点去掉,但没有空节点占位的话,这就涉及如何判断节点是否镜像了,而且假如就是有很多层数据,而且不是空的话,算法本身的效率就是瓶颈了。

Code (参考coderliang)

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def isSymmetric(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        if root == None:
            return True
        stack = [root.left, root.right]
        while not stack == None:
            if len(stack) == 0:
                return True
            left = stack.pop()
            right = stack.pop()
            if left == None and right == None:
                continue
            elif left == None or right == None:
                return False
            if not left.val == right.val:
                return False
            stack.append(left.left)
            stack.append(right.right)
            stack.append(left.right)
            stack.append(right.left)
        return True

清新多了,会看之前的代码,不忍直视…

Code (recursively 参考lvlolittle)

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def isSymmetric(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        return root == None or self.check(root.left, root.right)

    def check(self, left, right):
        if left == None or right == None:
            return left == right
        if left.val != right.val:
            return False
        return self.check(left.left, right.right) and self.check(left.right, right.left)

之前考虑怎么解决的时候还觉得递归没法实现,看到大神这样的代码,实在是惭愧。

Conclusion

题做的太少了,思维有些局限,没能灵活的运用代码解决问题。还是记住那句话好了,一题不能写超过50行代码,不然肯定是走弯路了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值