为了练习,我解决了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]
答案 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)时间。