1、二叉樹序列化
1、 每個節(jié)點的值結(jié)束后加入 “!” 用來分割,當節(jié)點是 null 的時候插入 “#” 返回。
//node 節(jié)點結(jié)構(gòu)
static class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
/**
* 序列化,先序遍歷
* @param root
* @param result
*/
static void serializable(TreeNode root, StringBuilder result) {
if (root != null) {
result.append(root.val).append("!");
serializable(root.left, result);
serializable(root.right, result);
} else {
result.append("#!");
}
}
2、反序列化
1、根據(jù)“!” 將字符串分割成string數(shù)組
2、遞歸調(diào)用重建二叉樹,先根據(jù)str[index] 是不是 “#”,判斷是否需要新建一個節(jié)點,如果不是null,new一個新節(jié)點,然后遞歸調(diào)用重建它的左子樹,之后是右子樹。
3、需要維護一個全局變量來表示string數(shù)組當前的偏移位置。
//
static int index = 0;
static TreeNode deserialize(String[] tree) {
if ("#".equals(tree[index])) {
index++;
return null;
} else {
TreeNode node = new TreeNode(Integer.parseInt(tree[index++]));
node.left = deserialize(tree);
node.right = deserialize(tree);
return node;
}
}
static void solution(String str) {
String[] strs = str.split("!");
TreeNode node = deserialize(strs);
}
public static void main(String[] args) {
TreeNode node1 = new TreeNode(1);
TreeNode node2 = new TreeNode(2);
TreeNode node3 = new TreeNode(3);
TreeNode node4 = new TreeNode(4);
TreeNode node5 = new TreeNode(5);
TreeNode node6 = new TreeNode(6);
TreeNode node7 = new TreeNode(7);
TreeNode node8 = new TreeNode(8);
node1.left = node2;
node1.right = node3;
node2.left = node4;
node3.left = node5;
node3.right = node6;
node5.left = node7;
node5.right = node8;
StringBuilder str = new StringBuilder("");
serializable(node1, str);
System.out.println(str);
solution(str.toString());
}