defserialize(self, root): """Encodes a tree to a single string. 广度优先遍历 :type root: TreeNode :rtype: str """ res = [] if root == None: return res queue = [] queue.append(root) whilelen(queue): # 可以选择提前结束,不过由于调用了内建方法,会影响整体效率。 # if set(queue) == set([None]): # break node = queue.pop(0) if node: res += [str(node.val)] queue.append(node.left) queue.append(node.right) else: res += ["null"]
return"[{}]".format(",".join(res))
defdeserialize(self, data): """Decodes your encoded data to tree. 利用字符串构建二叉树 :type data: str :rtype: TreeNode """ if data == "": returnNone if data == []: returnNone# 你永远不知道,LeetCode的输入是什么。 items = [int(x) if x !='null'elseNonefor x in data[1:-1].split(',')] iflen(items) == 0: returnNone nodeQueue = [] # nodeQueue保存的是这一层所有非空节点,要留着给下一层创建左右子树的时候用。 root = TreeNode(items[0]) # 创建一个根节点 nodeQueue.append(root) # 将根节点加入队列 cur = None lineNodeNum = 1*2# 记录下一层需要填充的节点的数量(注意不一定是2的幂,而是上一行中非空节点的数量乘2),第二层的节点数肯定是1*2。 startIndex = 1# 记录当前行中数字在数组中的开始位置,第0个位置在根节点,则第第二行第一个位置肯定是items[1]。 restLength = len(items) - 1# 记录数组中除去根节点剩余的元素的数量。 while restLength > 0: # 只要还有剩,就要继续添加。 i = startIndex while i < startIndex + lineNodeNum: # 一次while循环会处理掉一个layer。 if i == len(items): return root # 说明已经将nums中的数字用完,此时应停止遍历,并可以直接返回root cur = nodeQueue.pop(0) # cur是上一行的根节点。 if items[i] != None: # 如果是None,就不做处理,保留左节点为None的情况。 cur.left = TreeNode(items[i]) nodeQueue.append(cur.left)
classCodec: defserialize(self, root): """Encodes a tree to a single string. :type root: TreeNode :rtype: str """ ifnot root: return [] result = [] defencodes(root): ifnot root: result.append('$') return result.append(root.val) encodes(root.left) encodes(root.right) encodes(root) return result
defdeserialize(self, data): """Decodes your encoded data to tree. :type data: str :rtype: TreeNode """ ifnot data: return [] index = [0] #全局变量 defdecodes(data): if data[index[0]] == '$': index[0] += 1 returnNone node = TreeNode(data[index[0]]) index[0] += 1 node.left = decodes(data) node.right = decodes(data) return node