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

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

分析:
如图:
在这里插入图片描述
题目实际上就是用序列来表示一棵二叉树,然后还可以根据这个序列重建二叉树。对于上图中的树,以前序遍历为例,先访问到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;
	}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值