序列化二叉树

Posted by DH on August 1, 2017

题目

请实现两个函数,分别用来序列化和反序列化二叉树

分析

要确定一颗二叉树,可以用前序遍历和中序遍历唯一确定,因此可以把一颗二叉树序列化成前序和中序遍历,反序列化时,根据前序和中序重构。

但是,这有两个缺点:

(1)二叉树不能有数值相同的节点;

(2)必须将二叉树全部读入内存才能进行反序列化。

我们可以从根节点开始遍历,反序列化在根节点读出来之前就可以开始。这样就不用全部读入内存,因此我们可以利用前序遍历确定二叉树,前序遍历是“根-左-右”, 遇到空节点时,赋值为特殊字符,反序列化时,就利用特殊字符进行这些特殊字符确定节点。

举例说明:

图中二叉树的遍历顺序是:

1,2,4,#,#,#,3,5,#,#,6,#,#

如何反序列化呢?

首先读出根节点1,然后读出2,是1的左子树,接着4是2的左子树,#表示4的左孩子是空。下一个#表示4的右孩子也是空,接下来回到节点2,第三个#表示2的右孩子是空。

以此类推。

代码

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

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

    }

}
*/
public class Solution {
    int index = -1;
	// 前序遍历
	String Serialize(TreeNode root) {
        StringBuffer buffer = new StringBuffer();
		if (root == null) {
			buffer.append("#,");
			return buffer.toString();
		}
		buffer.append(root.val +",");
		// 递归的前序遍历
		buffer.append(Serialize(root.left));
		buffer.append(Serialize(root.right));
		
		return buffer.toString();
	  }
	
	
	TreeNode Deserialize(String str) {
	   index ++;		
	   // 字符串转化为数组
	   String [] strings = str.split(",");
	   TreeNode temp = null;
	   if (!strings[index].equals("#")) {
			temp = new TreeNode(Integer.valueOf(strings[index]));
			temp.left = Deserialize(str);
			temp.right = Deserialize(str);
		}
	    return temp;
    }
}