题目描述
请实现两个函数,分别用来序列化和反序列化二叉树
序列化:就是遍历输出,采用前序遍历
反序列化:根据序列,构造出二叉树
所谓序列化指的是遍历二叉树为字符串;依据前序遍历序列来序列化二叉树,因为前序遍历序列是从根结点开始的。当在遍历二叉树时碰到Null指针时,这些Null指针被序列化为一个特殊的字符“#”。 另外,结点之间的数值用逗号隔开。
所谓反序列化指的是依据字符串重新构造成二叉树。
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def Serialize(self, root):
# write code here
valuelist = []#整体结果列表
self.preorder(root, valuelist)
return ",".join(valuelist)#以,分割输出
def preorder(self, root, valuelist):#定义一个前序遍历的函数,valuelist用于整体存放数据
if not root:
valuelist.append("#")#null指针用#代替加入列表
return None
valuelist.append(str(root.val))#以字符形式加入列表
self.preorder(root.left, valuelist)#递归左边
self.preorder(root.right, valuelist)#递归右边
def Deserialize(self, s):
# write code here
valuelist = s.split(",")#将分割成列表
return self.build(valuelist)
def build(self, valuelist):
if len(valuelist)==0 or valuelist[0]=="":#列表无值
return None
val = valuelist.pop(0)#删除第一个值,根
if val == "#":
return None
root = TreeNode(int(val))#类型转换,根节点root
root.left = self.build(valuelist)#递归左子树构建
root.right = self.build(valuelist)#递归右子树构建
return root
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public int index=-1;
String Serialize(TreeNode root) {//前序遍历
StringBuilder sb=new StringBuilder();
if(root==null){
sb.append("#,");
return sb.toString();
}
sb.append(root.val+",");//注意双引号“,”
sb.append(Serialize(root.left));
sb.append(Serialize(root.right));
return sb.toString();
}
TreeNode Deserialize(String str) {
index++;
int len=str.length();
if(index>len) return null;
String[] strr=str.split(",");
TreeNode node=null;
if(!strr[index].equals("#")){
node=new TreeNode(Integer.valueOf(strr[index]));
node.left=Deserialize(str);
node.right=Deserialize(str);
}
return node;
}
}