剑指Offer——P37(序列化二叉树)

二叉树序列化与反序列化
本文介绍了一种实现二叉树序列化和反序列化的算法,使用前序遍历序列化二叉树,并在遇到空节点时用特殊字符标记。反序列化时,根据前序遍历的特性,读取根节点值即可开始重构二叉树。

题目:请实现两个函数,分别用来序列化和反序列化二叉树
解题思路:我们可以从前序遍历序列和中序遍历序列中构造出一颗二叉树。受此启发,我们可以先把一个二叉树序列化成前序序列和一个中序序列,然后在反序列化是通过这两个序列重构出原二叉树。这个思路有两个缺点:一是该方法要求二叉树中不能有数值重复的节点;二是只有当两个序列中的所有的数据都读出来后才能开会反序列化。如果两个遍历的序列流从一个流读出来的,那么可以需要等待较长的时间。实际上,如果二叉树的序列化是从根节点开始的,那么相应的反序列在根节点的数值读出来的时候就可以开始了。因此,我们可以根据前序遍历的顺序来序列化二叉树,因此前序遍历是从根节点开始的。在遍历二叉树碰到NullPtr指针时,这些nullPre序列化成一个特殊的字符(如‘$’)。另外,节点的数值之间要用一个特殊的字符(‘如,’)隔开。

package jianzhi_offer;

class TreeNode {
	int val = 0;
	TreeNode left = null;
	TreeNode right = null;

	public TreeNode(int val) {
		this.val = val;

	}

}

public class P37_Solution {
	public int index = -1;
	String Serialize(TreeNode root) {
		StringBuffer sb = new StringBuffer();
		if (root == null) {
			sb.append("#,");
			return sb.toString();
		}
		sb.append(root.val + ",");
		sb.append(Serialize(root.left));
		sb.append(Serialize(root.right));
		return sb.toString();
	}

	TreeNode Deserialize(String str) {
		index++;
		int len = str.length();
		if (index >= len) {
			return null;
		}
		TreeNode root = null;
		String[] str_arr = str.split(",");
		if (!str_arr[index].equals("#")) {
			root = new TreeNode(Integer.valueOf(str_arr[index]));
			root.left = Deserialize(str);
			root.right = Deserialize(str);
		}
		return root;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值