您的位置:首页 > 职场人生

【Java】面试题37:序列化二叉树

2019-03-25 14:52 316 查看

题目描述:
请实现两个函数,分别用来序列化和反序列化二叉树。

分析:
如图:
题目实际上就是用序列来表示一棵二叉树,然后还可以根据这个序列重建二叉树。对于上图中的树,以前序遍历为例,先访问到1,然后2,然后4,4的左右子结点都为空,可以用一个特殊字符替代,所以上图中的二叉树前序遍历表示就是“1,2,4,替代,所以上图中的二叉树前序遍历表示就是“1,2,4,替代,所以上图中的二叉树前序遍历表示就是“1,2,4,,,,,,3,5,,,,,6,,,,”。
重建的时候,访问的第一个结点为根结点,接下来的数字是2,它是根结点的左子结点。接下来的是4,它是2的左子结点。然后遇到两个,说明4的左右子结点都是NULL。接下来结点回退,访问4的父结点2,又是,说明4的左右子结点都是NULL。接下来结点回退,访问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 Strin
2cb1a
g 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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: