题目描述:
请实现两个函数,分别用来序列化和反序列化二叉树。
分析:
根据前序遍历的顺序来进行序列化,前序遍历是从根结点开始,在遍历二叉树碰到null指针时,就将其序列化为一个特殊字符,比如#,另外,结点的数值之间用一个特殊字符(比如,)进行分隔。比如对于以下的树,序列化为字符串:"1,2,4,#,#,#,3,5,#,#,6,#,#"。
然后我们可以以"1,2,4,#,#,#,3,5,#,#,6,#,#"为例来分析反序列化的过程,第一个读出1,这是根结点的值,然后读出2,这是根结点的左孩子,同样接下来的4是值为2的结点的左孩子结点;接下来读出两个“#”,说明值为4的结点左右孩子都是null,这是一个叶结点。然后回到值为2的结点,重建它的右子树,由于下一个字符是“#”,说明值为2的结点的右孩子结点为null,这个结点的左右子树都重建完毕,接下来再次回溯就到了根结点,所以,左子树重构完毕。
由于下一个数字是3,所以右子树的根结点值为3,左结点时一个值为5的叶结点(因为接下来的三个字符是5,#,#),同理右结点时一个值为6的结点。至此,重构完毕,反序列化完成。
序列化比较简单,就是一个前序遍历的过程,而反序列化也不难发现,实际就是一个递归解决每个子树的问题,详见以下代码实现。
python版本示例代码:
class TreeNode:
def ___init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def Serialize(self, pRoot):
retlist = []
def preOrder(pRoot):
if pRoot == None:
retlist.append("#")
retrun
retlist.append(str(pRoot.val))
preOrder(pRoot.left)
preOrder(pRoot.right)
preOrder(pRoot)
return " ".join(retlist)
def Deserialize(self, s):
retlist = s.split()
def dePreOrder():
if retlist == []:
return None
rootVal = retlist[0]
del retlist[0]
if rootVal == "#":
return None
node = TreeNode(int(rootVal))
leftNode = dePreOrder()
rightNode = dePreOrder()
node.left = leftNode
node.right = rightNode
return node
pRoot = dePreOrder()
return pRoot
Java版本示例代码:
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
public class Solution {
String Serialize(TreeNode root) {
// 序列化为前序遍历序列,空节点用#表示 String str = "";
return Serialize(root, str);
}
String Serialize(TreeNode root, String str) {
if (root == null) { //序列化根节点 str += "#,";
return str;
} else
str += root.val+",";
str = Serialize(root.left, str); //序列化左子树 str = Serialize(root.right, str); //序列化右子树 return str;
}
int start=-1;
//反序列化,根据序列重构建树 TreeNode Deserialize(String str) {
if (str == null || str.length() == 0)
return null;
String[] strArr = str.split(",");
return Deserialize(strArr);
}
TreeNode Deserialize(String[] strArr) {
start++;
if (start < strArr.length && !strArr[start].equals("#")) {
TreeNode cur = new TreeNode(Integer.parseInt(strArr[start]));
cur.left = Deserialize(strArr);
cur.right = Deserialize(strArr);
return cur;
}
return null;
}
}欢迎关注,一起学习