把二叉树打印成多行
序列化与反序列化二叉树
把二叉树打印成多行
问题 从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
思路: 层次遍历,注意多用一个列表存储当前这层的数据,一个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
2071

被折叠的 条评论
为什么被折叠?



