剑指offer:Python 序列化二叉树 二叉树的先序遍历

题目描述

请实现两个函数,分别用来序列化和反序列化二叉树

二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。

二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。

思路及Python实现

  • 二叉树的序列化
    用先序遍历,会比较好,因为先序遍历的顺序:根,左,右 ;如果没有下一个结点就添加一个“#”!具体做法:先序序列化二叉树:定义一个res数组保存序列过程中的结果,按照先序遍历方式遍历二叉树,若结点非空则把 “结点值” append到res中;若结点空则把 “#” append到res中;最后用用res数组生成字符串就是序列化结果!
  • 二叉树的反序列化
    二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
    具体做法:分割二叉树的序列化字符串,遍历nodes数组建立二叉树,如果当前遍历元素非 # 则作为一个结点插入树中作为上一结点的左子树,当前遍历元素为 # 则表示此子树已结束,遍历下一元素作为上一结点的右子树!
class TreeNode:
	def __init__(self, x):
		self.val = x
		self.left = None
		self.right = None

class Solution:
    def Serialize(self, root): # 序列化
        ret_list = []

        def pre_order(root): 
            if ret_list is []:
                return None
            if root is None:
                ret_list.append("#")
                return
            ret_list.append(str(root.val))
            pre_order(root.left)
            pre_order(root.right)

        pre_order(root)
        return ' '.join(ret_list)

    def Deserialize(self, s): # 反序列化
        ret_list = s.split()
        def de_pre_order():
            root_val = ret_list.pop(0)
            if root_val == "#":
                return None
            node = TreeNode(int(root_val))
            left_node = de_pre_order()
            right_node = de_pre_order()
            node.left = left_node
            node.right = right_node
            return node

        pRoot = de_pre_order()
        return pRoot
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值