mio4 Java Web & Web Security

序列化二叉树

2018-09-01
mio4

阅读:


序列化二叉树

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

分析

  • 序列化:将对象的信息/状态转换为可以存储的方式
  • 反序列化:将存储的信息转换为对象
  • 对本题来说就是将多维的二叉树转换为一维数组,以及提取一维数组信息还原二叉树的过程
  • 序列化很简单,对于空节点使用$符号代替,将树分为根节点、左子树、右子树递归遍历(前序)加入数组
  • 反序列化也是同样递归处理
class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;
    }
}
public class Solution {
	public static int cnt = -1;
	public static 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();
	}
	public static TreeNode Deserialize(String str) {
		cnt++;
		String[] strs = str.split(",");
		TreeNode node = null;
		if(!strs[cnt].equals("$") ) {
			node = new TreeNode(Integer.valueOf(strs[cnt]));
			node.left = Deserialize(str);
			node.right = Deserialize(str);
		}
		return node;
	}

	public static void main(String[] args){
		TreeNode root = new TreeNode(1);
		TreeNode p1 = new TreeNode(2);
		TreeNode p2 = new TreeNode(3);
		root.left = p1;
		root.right = p2;
		String str = Serialize(root);
		Deserialize(str);
	}
}

  • 难点在于反序列化
    • 上述中cnt的作用是记录对于str的解析位置,从0开始,每次生成一个节点则+1
    • 有意义的节点一定是不为$并且由于cnt约束一定是先前没有生成的,同时由于递归在字符串数组中也会满足根节点-左子树部分-右子树部分的解析顺序

上一篇 字符串的排列

Comments

Content