私はバイナリツリーをシリアル化して逆シリアル化する次のコードを持っています。シリアル化は正常に動作しますが、逆シリアル化は正しくありません。私は配列インデックスカウンタ "i"をどのように非直列化に設定すべきかを理解するのに苦労しています。私がこれを理解するのを助けることができれば、本当に感謝しています。再帰カウンター
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
public String serialize(TreeNode root) {
StringBuffer serial = new StringBuffer();
helperSerialize(root, serial);
return serial.toString();
}
public void helperSerialize(TreeNode node, StringBuffer serial) {
if (node == null) {
serial.append("null ");
return;
}
serial.append(new Integer(node.val).toString() + " ");
helperSerialize(node.left, serial);
helperSerialize(node.right, serial);
}
public TreeNode deSerialize(TreeNode root, String s) {
String[] split = s.split("\\s+");
root = deSerialize(split, 0);
return root;
}
public TreeNode deSerialize(String[] s, int i) {
if(i >= s.length || s[i].equals("null"))
return null;
else {
int v = (int) s[i].charAt(0) - '0';
TreeNode root = new TreeNode(v);
root.left = deSerialize(s, ++i);
i = i +1; // i should be incremented for next recursion
root.right = deSerialize(s, ++i);
return root;
}
}
あなたの基本的なソースは、あなたがシリアライズよりも概念的に異なる方法でデシリアライズしようとしています。シリアル化するときに追加する整数トークン。デシリアライズのためにやっているこの奇妙なインデックスベースの代わりに、文字列バッファの最初のトークンを解析して消費してください。デシリアライズする前にint型のリストに解析することもあります。消費するときにリストの先頭をポップする方が簡単です。 –
何が起きているのですか?値渡しで参照渡しではないので、ツリーにすべてのブランチで繰り返し値が返され、インデックスを含むパラメータにint []を渡してみてください。 – Wicpar