如何检查树是否为对称Python

时间:2019-02-10 17:39:09

标签: python-3.x

为了练习,我解决了Leetcode 101. Symmetric Tree问题:

  

给出一棵二叉树,检查它是否是其自身的镜像(即,围绕其中心对称)。

我有想法进行有序遍历,将每个节点值记录到列表中,并从列表的第一部分和第二部分开始检查值。但 在测试用例 [1,2,3,3,null,2,null] 上失败 从我本地的值返回 [3,2,None,1,2,3,None] ,但是从leetcode中返回 [3,2,1,2,3] 有人知道我的代码为什么出错吗?

def isSymmetric(root: 'TreeNode') -> 'bool':

    if not root: return True
    value = []

    def traversal(cur):
        if cur:
            traversal(cur.left)
            value.append(cur.val)
            traversal(cur.right)

    traversal(root)
    size = int(len(value) / 2)
    return value[:size] == value[size + 1:][-1::-1]

1 个答案:

答案 0 :(得分:0)

恐怕顺序遍历不能唯一地确定一棵树。例如一棵有结构的树

1
 \
  2
   \
    3

具有与

相同的顺序遍历
  2
 / \
1   3

由于您具有if cur条件,因此有序遍历将不包含空节点,这将导致遍历不唯一。您可以像这样包含空节点:

 def traverse(cur):
     if cur:
         traverse(cur.left)
     values.append(cur.val if cur else None)
     if cur:
         traverse(cur.right)

这将唯一地序列化树节点。

在这种情况下,您还可以确定左节点和右节点的结构相同(除非左右颠倒了)。这是我接受的解决方案:

class Solution:
    def isSymmetric(self, root: 'TreeNode') -> 'bool':
        if not root:
            return True
        return self.isSymmetricHelper(root.left, root.right)

    def isSymmetricHelper(self, node1, node2):
        if node1 is None and node2 is None:
            return True
        if node1 is None or node2 is None:
            return False
        if node1.val != node2.val: # early stopping - two nodes have different value
            return False 
        out = True
        out = out and self.isSymmetricHelper(node1.left, node2.right)
        if not out: # early stopping
            return False
        out = out and self.isSymmetricHelper(node1.right, node2.left)
        return out

它以递归方式检查两棵树是否彼此镜像(有些早停了下来)。想法是,如果两棵树是镜像的,则tree1的左子树必须是tree2的右子树的镜像,同样适用于tree1的右子树和tree2的左子树。

尽管两者的运行时间均为O(n),但他的递归方法占用O(logn)平均空间(由调用堆栈使用)并具有内置的提前停止功能,而您的serialize-all-nodes方法则占用O(n )空间O(n)时间。