一、题目描述
请实现两个函数,分别用来序列化和反序列化二叉树。
二、题解
可以根据前序遍历的顺序来序列化二叉树,因为前序遍历序列是从根节点开始的。在遍历二叉树碰到null指针时,这些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的叶节点,因为最后三个字符是“6,#,#”。
三、代码实现
public class Solution {
int index = -1; //计数变量
//序列化二叉树
public 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();
}
//反序列化二叉树
public TreeNode Deserialize(String str) {
index++;
String[] strarr = str.split(",");
TreeNode node = null;
if(!strarr[index].equals("#")){
node = new TreeNode(Integer.valueOf(strarr[index]));
node.left = Deserialize(str);
node.right = Deserialize(str);
}
return node;
}
}
---------------------
作者:kongmin_123
来源:优快云
原文:https://blog.csdn.net/kongmin_123/article/details/82532498