トピック
シリアル化とは、データ構造またはオブジェクトを連続ビットに変換する操作であり、変換されたデータをファイルまたはメモリに保存したり、ネットワークを介して別のコンピュータ環境に送信したり、逆の方法で再構築したりすることもできます。元のデータを取得します。
バイナリツリーのシリアル化と逆シリアル化を実現するアルゴリズムを設計してください。シーケンス/逆シリアル化アルゴリズムの実行ロジックに制限はありません。バイナリツリーを文字列にシリアル化し、この文字列を元のツリー構造に逆シリアル化できることを確認するだけで済みます。リンク
アイデア
幅優先のアプリケーションの場合、文字列を格納するときにセパレータを追加するだけで済みます。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
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 t = queue.poll();
if(t != null){
sb.append(t.val + ",");
queue.offer(t.left);
queue.offer(t.right);
}else{
sb.append("null,");
}
}
return sb.toString();
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
String[]node = data.split(",");
TreeNode root = null;
if(node.length>0){
root = getNode(node[0]);
int idx = 1;
Queue<TreeNode>queue = new LinkedList<>();
queue.offer(root);
while(idx<node.length){
TreeNode t = queue.poll();
if(t != null){
t.left = getNode(node[idx++]);
t.right = getNode(node[idx++]);
queue.offer(t.left);
queue.offer(t.right);
}
}
}
return root;
}
TreeNode getNode(String s){
if(s.equals("null")){
return null;
}else{
return new TreeNode(Integer.valueOf(s));
}
}
}