1.题目描述
请实现两个函数,分别用来序列化和反序列化二叉树。
所谓序列化指的是遍历二叉树为字符串;所谓反序列化指的是依据字符串重新构造成二叉树。
2.算法描述
依
据
前
序
遍
历
序
列
来
序
列
化
二
叉
树
,
因
为
前
序
遍
历
序
列
是
从
根
结
点
开
始
的
。
\red{依据前序遍历序列来序列化二叉树,因为前序遍历序列是从根结点开始的。}
依据前序遍历序列来序列化二叉树,因为前序遍历序列是从根结点开始的。
当
在
遍
历
二
叉
树
时
碰
到
空
指
针
时
,
这
些
空
指
针
被
序
列
化
为
一
个
特
殊
的
字
符
#
。
\red{当在遍历二叉树时碰到空指针时,这些空指针被序列化为一个特殊的字符\#。}
当在遍历二叉树时碰到空指针时,这些空指针被序列化为一个特殊的字符#。
另
外
,
结
点
之
间
的
数
值
用
逗
号
隔
开
。
{另外,结点之间的数值用逗号隔开。}
另外,结点之间的数值用逗号隔开。
3.代码描述
3.1.Java代码
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
int index = -1;//计数变量
String Serialize(TreeNode root) {
StringBuffer sb = new StringBuffer();
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++;
String[] chars =str.split(",");
TreeNode root = null;
if(!chars[index].equals("#")){
root = new TreeNode(Integer.valueOf(chars[index]));
root.left = Deserialize(str);
root.right = Deserialize(str);
}
return root;
}
}
3.2.Python代码
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def __init__(self):
self.index = -1
def Serialize(self, root):
if not root:
return '#'
ans = str(root.val)+',' + self.Serialize(root.left)+',' + self.Serialize(root.right)
return ans
def Deserialize(self, s):
self.index += 1
chars = s.split(',')
root = None
if chars[self.index] != '#':
root = TreeNode(int(chars[self.index]))
root.left = self.Deserialize(s)
root.right = self.Deserialize(s)
return root