美文网首页
二叉树序列化与反序列化

二叉树序列化与反序列化

作者: 小幸运Q | 来源:发表于2021-04-21 16:40 被阅读0次

image.png image.png

一开始的想法是求先序+中序遍历字符串拼接在一起,然后再恢复,其实不必。

class Codec:
    def order(self, root):
        if root == None:
            return "#","#"
        preleft,inleft = self.order(root.left)
        preright,inright = self.order(root.right)
        return str(root.val)+","+preleft+","+preright,inleft+","+str(root.val)+","+inright
    def serialize(self, root):
        preorder,inorder=self.order(root)
        return preorder+"|"+inorder
    def check(self,data1,data2):
        d1={}
        d2={}
        for i in range(len(data1)):
            if data1[i] in d1:
                d1[data1[i]]+=1
            else:
                d1[data1[i]]=1
            
            if data2[i] in d2:
                d2[data2[i]]+=1
            else:
                d2[data2[i]]=1
        if sorted(list(d1.keys()))==sorted(list(d2.keys())):
            for i in d1.keys():
                if d1[i]!=d2[i]:
                    return False
            return True
        else:
            return False
    def decode(self,data1,l1,r1,data2,l2,r2):
        if l1>r1 or l2>r2:
            return None
        if data1[l1]=="#":
            return None
        if l1==r1 or l2==r2:
            return TreeNode(int(data1[l1]))
        for i in range(l2,r2+1):
            if data2[i]==data1[l1]:
                if self.check(data1[l1+1:i-l2+l1+1],data2[l2:i]):
                    break
        left=self.decode(data1,l1+1,l1+i-l2,data2,l2,i-1)
        right=self.decode(data1,l1+i-l2+1,r1,data2,i+1,r2)
        root=TreeNode(int(data1[l1]))
        root.left=left
        root.right=right
        return root

    def deserialize(self, data):
        data1,data2=data.split("|")
        data1=data1.split(",")
        data2=data2.split(",")
        return self.decode(data1,0,len(data1)-1,data2,0,len(data2)-1)

最优解:

对于 "#" 标记null的点可以只用前序遍历。中序没法知道root在哪里。后序也可以。

获取首节点start,输入start+1获取左子树的root节点和右子树的首节点位置前一位id。

class Codec:
    def order(self, root):
        if root == None:
            return "#"
        preleft = self.order(root.left)
        preright = self.order(root.right)
        return str(root.val)+","+preleft+","+preright
    def serialize(self, root):
        preorder=self.order(root)
        return preorder

    def decode(self,data,start):
        if data[start]=="#":
            return None,start
        if start>=len(data):
            return None,start
        left,id=self.decode(data,start+1)
        right,id=self.decode(data,id+1)
        node=TreeNode(data[start])
        node.left=left
        node.right=right
        return node,id
    def deserialize(self, data):
        data=data.split(",")
        node,id = self.decode(data,0)
        return node

相关文章

  • 二叉树序列化和反序列化

    二叉树序列化和反序列化 前序 序列化和反序列化

  • 297. Serialize and Deserialize B

    二叉树序列化与反序列化 Runtime: 172 ms, faster than 42.05% Memory Us...

  • 二叉树的三种遍历方法

    二叉树的序列化 为了方便构造二叉树来验证我们的算法,这里先介绍下二叉树的序列化和反序列化。 序列化 先序遍历整颗二...

  • LeetCode:序列化二叉树

    面试题37. 序列化二叉树 请实现两个函数,分别用来序列化和反序列化二叉树。示例:你可以将以下二叉树: 序列化为 ...

  • 剑指offer刷题记录(C++版本)(之七)

    61.序列化二叉树??? 题目:请实现两个函数,分别用来序列化和反序列化二叉树 二叉树的序列化是指:把一棵二叉树按...

  • JZ-061-序列化二叉树

    序列化二叉树 题目描述 请实现两个函数,分别用来序列化和反序列化二叉树。二叉树的序列化是指:把一棵二叉树按照某种遍...

  • 二叉树的序列化 和反序列化

    对于二叉树的序列化与反序列化有n种方法,本文以先序和层序的方式序列化和反序列化 对于,以先序的方式序列化: 1、以...

  • 面试题37:序列化二叉树

    题目 实现两个函数,分别用来序列化和反序列化二叉树 解题思路 序列化根据前序遍历的顺序序列化二叉树,从根节点开始,...

  • 剑指Offer-61 二叉树序列化

    请实现两个函数,分别用来序列化和反序列化二叉树 利用广度遍历实现二叉树的序列化和非序列化。核心思想:广度遍历

  • LeetCode 297. 二叉树的序列化与反序列化 | Pyt

    297. 二叉树的序列化与反序列化 题目来源:力扣(LeetCode)https://leetcode-cn.co...

网友评论

      本文标题:二叉树序列化与反序列化

      本文链接:https://www.haomeiwen.com/subject/dqhzlltx.html