题目描述:
请实现两个函数,分别用来序列化和反序列化二叉树。
分析:
如图:
题目实际上就是用序列来表示一棵二叉树,然后还可以根据这个序列重建二叉树。对于上图中的树,以前序遍历为例,先访问到1,然后2,然后4,4的左右子结点都为空,可以用一个特殊字符#替代,所以上图中的二叉树前序遍历表示就是“1,2,4,#,#,#,3,5,#,#,6,#,#”。
重建的时候,访问的第一个结点为根结点,接下来的数字是2,它是根结点的左子结点。接下来的是4,它是2的左子结点。然后遇到两个#,说明4的左右子结点都是NULL。接下来结点回退,访问4的父结点2,又是#,说明2的右子结点是NULL。再返回到根结点,这时候该建立它的右子结点了,下一个数值是3,说明3是根结点的右子结点,剩下的步骤和左子树部分类似。
package jianZhiOffer;
/*
* 面试题37:序列化二叉树
* 请实现两个函数,分别用来序列化和反序列化二叉树
*/
public class Demo37 {
public static void main(String[] args) {
ListNode root = new ListNode(1);
root.left = new ListNode(2);
root.left.left = new ListNode(4);
root.right = new ListNode(3);
root.right.left = new ListNode(5);
root.right.right = new ListNode(6);
String s = Serialize(root);
System.out.println(s);
Deserialize(s);
}
static StringBuilder sb = null;
static String Serialize(ListNode root) { //序列化
if(root==null)
return "#";
sb = new StringBuilder();
Serialize_solve(root);
String s = sb.toString();
return s.substring(0,s.length()-1);
}
private static void Serialize_solve(ListNode root) {
if(root==null) {
sb.append("#,");
return ;
}
sb.append(root.val+",");
Serialize_solve(root.left);
Serialize_solve(root.right);
}
static int index;
static ListNode Deserialize(String str) { //反序列化
if(str==null || str.trim().equals("")) //去掉字符串两端多余的空格
return null;
String[] strs = str.split(",");
index=0;
return Deserialize_solve(strs);
}
private static ListNode Deserialize_solve(String[] chars) {
if(chars[index].equals("#")) {
index++;
return null;
}
System.out.print(chars[index]+" ");
ListNode node = new ListNode(Integer.parseInt(chars[index++]));
node.left = Deserialize_solve(chars);
node.right = Deserialize_solve(chars);
return node;
}
}