解题思路
序列化二叉树
递归遍历二叉树的节点,空节点使用#代替,节点之间使用逗号隔开,返回字符串
反序列化二叉树
设置序号index,将字符串根据逗号分割为数组,根据index的值来设置树节点的val,如果节点的值为#,则返回空的树节点。
public class SerializeTree {
int index = -1;
/**
* 分别遍历左节点和右节点,空使用#代替,节点之间,隔开
*
* @param root
* @return
*/
public String Serialize(TreeNode root) {
if (root == null) {
return "#";
} else {
return root.val + "," + Serialize(root.left) + "," + Serialize(root.right);
}
}
/**
* 使用index来设置树节点的val值,递归遍历左节点和右节点,如果值是#则表示是空节点,直接返回
*
* @param str
* @return
*/
TreeNode Deserialize(String str) {
String[] s = str.split(",");//将序列化之后的序列用,分隔符转化为数组
index++;//索引每次加一
int len = s.length;
if (index > len) {
return null;
}
TreeNode treeNode = null;
if (!s[index].equals("#")) {//不是叶子节点 继续走 是叶子节点出递归
treeNode = new TreeNode(Integer.parseInt(s[index]));
treeNode.left = Deserialize(str);
treeNode.right = Deserialize(str);
}
return treeNode;
}
public static void main(String[] args) {
TreeNode treeNode1 = new TreeNode(1);
TreeNode treeNode2 = new TreeNode(2);
TreeNode treeNode3 = new TreeNode(3);
TreeNode treeNode4 = new TreeNode(4);
TreeNode treeNode5 = new TreeNode(5);
TreeNode treeNode6 = new TreeNode(6);
treeNode1.left = treeNode2;
treeNode1.right = treeNode3;
treeNode2.left = treeNode4;
treeNode3.left = treeNode5;
treeNode3.right = treeNode6;
SerializeTree serializeTree = new SerializeTree();
String str = serializeTree.Serialize(treeNode1);
TreeNode treeNode = serializeTree.Deserialize(str);
}
}
京公网安备 11010502036488号