树(7)-----二叉树的序列化和反序列化

1、序列化:层次遍历【用字符串来存储】

2、反序列化:用队列存已经建立的节点,从序列化后的字符串列表取数来建立树

    def serialize(self, root):
        """Encodes a tree to a single string.
        
        :type root: TreeNode
        :rtype: str
        """
        if not root:
            return ""
        prev,strres=[root],""
        while prev:
            cur=[]
            while prev:
                node=prev.pop(0)
                if node:
                    strres+=str(node.val)+','
                    cur.append(node.left)
                    cur.append(node.right)
                else:
                    strres+='#'+','
            prev=cur
        return strres[:-1]
        

    def deserialize(self, data):
        """Decodes your encoded data to tree.
        
        :type data: str
        :rtype: TreeNode
        """
        if not data:
            return None
        listdata=data.split(',')
        root=TreeNode(listdata[0])
        queue=[root]
        i=0
        while queue:
            node=queue.pop(0)
            if listdata[i+1]!='#':
                node.left=TreeNode(listdata[i+1])
                queue.append(node.left)
            i+=1
            if listdata[i+1]!='#':
                node.right=TreeNode(listdata[i+1])
                queue.append(node.right)
            i+=1
        return root

 二、前序遍历的序列化:

代码:

class Tree:
    def __init__(self,val):
        self.val =val
        self.left = None
        self.right = None

#主要函数
def preOrder(head):
    if not head:
        return '#!'
    s = str(head.val) + '!'
    s += preOrder(head.left)
    s += preOrder(head.right)
    return s


tree = Tree(12)
tree.left = Tree(3)
preOrder(tree)

反序列化:

class Tree:
    def __init__(self,val):
        self.val =val
        self.left = None
        self.right = None
def repreOrder(s):
    if not s:
        return None
    arr = s.split('!')
    return reconPre(arr)
def reconPre(arr):
    if arr:
        value = arr.pop(0)
        if value == '#':
            return None
        head = Tree(int(value))
        head.left = reconPre(arr)
        head.right = reconPre(arr)
        return head
    else:
        return None
s = '12!3!#!#!#!'
repreOrder(s)    

 

3、前序遍历和中序遍历反序列化

    def buildTree(self, preorder, inorder):
        if preorder and inorder:
            root=TreeNode(preorder[0])
            k=inorder.index(preorder[0])
            m=len(inorder[:k])
            root.left=self.buildTree(preorder[1:1+m],inorder[0:k])
            root.right=self.buildTree(preorder[1+m:],inorder[k+1:])
            return root
            

 

转载于:https://www.cnblogs.com/Lee-yl/p/9250242.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值