##前序
# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def Serialize(self, root):
        # write code here
        if not root:
            return '#!'
        return str(root.val)+'!'+self.Serialize(root.left)+self.Serialize(root.right)
    def Deserialize(self, s):
        # write code here
        new_s=s.split('!')
        new_s.pop(-1)
        def deserialize():
            val=new_s.pop(0)
            if val=='#':
                return None
            node=TreeNode(int(val))
            node.left=deserialize()
            node.right=deserialize()
            return node
        return deserialize()
##后序
# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def Serialize(self, root):
        # write code here
        if not root:
            return '#!'
        return self.Serialize(root.left)+self.Serialize(root.right)+str(root.val)+'!'
    def Deserialize(self, s):
        # write code here
        new_s=s.split('!')
        new_s.pop(-1)
        def deserialize():
            val=new_s.pop(-1)
            if val=='#':
                return None
            node=TreeNode(int(val))
            node.right=deserialize()
            node.left=deserialize()
            return node
        return deserialize()
##层次
# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def Serialize(self, root):
        # write code here
        if not root:
            return '#!'
        lst=[str(root.val)]
        queue=[root]
        while queue:
            node=queue.pop(0)
            if node.left:
                queue.append(node.left)
                lst.append(str(node.left.val))
            else:
                lst.append('#')
            if node.right:
                queue.append(node.right)
                lst.append(str(node.right.val))
            else:
                lst.append('#')
        return '!'.join(lst)
    def Deserialize(self, s):
        # write code here
        new_s=s.split('!')
        new_s.pop(-1)
        if new_s[0]=="#":
            return None
        root=TreeNode(int(new_s[0]))
        queue=[root]
        index=1
        while queue:
            val=queue.pop(0)
            if val!=None:
                val.left=(TreeNode(int(new_s[index])) if new_s[index]!='#' else None)
                queue.append(val.left)
                index+=1
                if index>=len(new_s):
                    return root
                val.right=(TreeNode(int(new_s[index])) if new_s[index]!='#' else None)
                queue.append(val.right)
                index+=1
                if index>=len(new_s):
                    return root