Serialize and Deserialize Binary Tree

  • 推荐方法

public class Seri {

	String result="";
	int id=0;
	private int serialWork(TreeNode root){
		if (root==null) return -1;
		id++;
		int nowId=id;
		int leftId=serialWork(root.left);
		int rightId=serialWork(root.right);
		result+=root.val+","+nowId+","+leftId+","+rightId+";";
		return nowId;
	}


	public String serialize(TreeNode root) {
		// write your code here
		int rootId=serialWork(root);
		return result;
	}

	public TreeNode deserialize(String data) {
		// write your code here
		String[] nodes=data.split(";");
		HashMap<Integer,TreeNode> nodeHashMap=new HashMap<Integer, TreeNode>();
		for (int i=0;i<nodes.length;i++){
			String[] datas=nodes[i].split(",");
			if (datas.length!=4) continue;
			if (!nodeHashMap.containsKey(Integer.parseInt(datas[1]))) {
				TreeNode node = new TreeNode(Integer.parseInt(datas[0]));
				nodeHashMap.put(Integer.parseInt(datas[1]), node);
			}
			else{
				nodeHashMap.get(Integer.parseInt(datas[1])).val=Integer.parseInt(datas[0]);
			}
			if (!nodeHashMap.containsKey(Integer.parseInt(datas[2])) && Integer.parseInt(datas[2])!=-1){
				nodeHashMap.put(Integer.parseInt(datas[2]),new TreeNode(-1));
			}
			if (!nodeHashMap.containsKey(Integer.parseInt(datas[3])) && Integer.parseInt(datas[3])!=-1){
				nodeHashMap.put(Integer.parseInt(datas[3]),new TreeNode(-1));
			}
			nodeHashMap.get(Integer.parseInt(datas[1])).left=nodeHashMap.get(Integer.parseInt(datas[2]));
			nodeHashMap.get(Integer.parseInt(datas[1])).right=nodeHashMap.get(Integer.parseInt(datas[3]));
		}

		return nodeHashMap.get(1);
	}
}
  • 其他方法

public class Codec {

    // Encodes a tree to a single string.
    public String serialize(TreeNode root) {
        StringBuilder sb = new StringBuilder();
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        
        while (!queue.isEmpty()) {
            TreeNode node = queue.poll();
            if (node == null) {
                sb.append("N");
            } else {
                sb.append(node.val);
                queue.offer(node.left);
                queue.offer(node.right);
            }
            sb.append("#");
        }
        sb.setLength(sb.length() - 1);
        // System.out.println(sb);
        return sb.toString();
    }

    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        String[] strs = data.split("#");
        if (strs.length == 1 && "N".equals(strs[0])) {
            return null;
        }
        TreeNode root = new TreeNode(Integer.parseInt(strs[0]));
        Queue<TreeNode> queue = new ArrayDeque<>();
        queue.offer(root);
        int i = 1;
        while (i < strs.length) {
            TreeNode node = queue.poll();
            if (!"N".equals(strs[i])) {
                node.left = new TreeNode(Integer.parseInt(strs[i]));
                queue.offer(node.left);
            }
            i++;
            if (!"N".equals(strs[i])) {
                node.right = new TreeNode(Integer.parseInt(strs[i]));
                queue.offer(node.right);
            }
            i++;
        }
        return root;
    }
}

最后更新于

这有帮助吗?