0410 剑指offer

把二叉树打印成多行

序列化与反序列化二叉树

 把二叉树打印成多行

 

问题 从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
思路: 层次遍历,注意多用一个列表存储当前这层的数据,一个list存储上一层的内容,一个存储当前层的值,一个list作为最终的result .注意利用list.pop出队。

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    # 返回二维列表[[1,2],[4,5]]
    def Print(self, pRoot):
        # write code here
        #思路,层次遍历,注意多用一个列表存储当前这层的数据.注意利用list.pop
        if not pRoot:
            return []
        result=[]#最终的返回结果
        queue=[pRoot]#上一层的内容
        while queue:
            temp=[]#当前层内容,每一次循环清空了
            length=len(queue)
            for i in range(length):
                current=queue.pop(0)#pop出队,出了就不在了
                temp.append(current.val) #存储当前层的值
                if current.left:
                    queue.append(current.left)
                if current.right:
                    queue.append(current.right)
            result.append(temp)
        return result

序列化二叉树

题目描述
请实现两个函数,分别用来序列化和反序列化二叉树
思路:

#根据某种遍历顺序得到的序列化字符串,重构二叉树。具体思路是按前序遍历“根左右”的顺序。 序列化与反序列化用同一种遍历方式

#根节点位于其左右子节点的前面,即非空(#)的第一个节点是某子树的根节点,左右子节点在该根节点后,

#以空节点#为分隔符。通过递归来实现

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
#
class Solution:
    #思路:首先明确序列化树与反序列化树的概念是什么?
    #将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。
    #序列化二叉树时,中间某个子节点为空节点时,空节点也需要存入字符串中。 
    def Serialize(self, root):
        #序列化可以基于先序/中序/后序/按层等遍历方式进行,这里采用先序遍历的方式实现,字符串之间用 “,”隔开。
        if not root:
            return '#'
        return str(root.val)+','+self.Serialize(root.left)+','+self.Serialize(root.right)
        
        # write code here
    def Deserialize(self, s):
        # write code here
        #根据某种遍历顺序得到的序列化字符串,重构二叉树。具体思路是按前序遍历“根左右”的顺序。
        #序列化与反序列化用同一种遍历方式
        #根节点位于其左右子节点的前面,即非空(#)的第一个节点是某子树的根节点,左右子节点在该根节点后,
        #以空节点#为分隔符。通过递归来实现
        list=s.split(',')
        return self.deserializeTree(list)
    
    def deserializeTree(self,list):
        if len(list)<=0:
            return None
        val=list.pop(0)
        root=None#注意此处赋个None
        if val !='#':
            root=TreeNode(int(val))#根,
            root.left=self.deserializeTree(list)#左,对子节点递归来实现
            root.right=self.deserializeTree(list)#右
        return root
            
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值