[关闭]
@w1024020103 2017-07-07T00:04:34.000000Z 字数 2556 阅读 505

Binary Tree Serialization

LintCode LeetCode


image_1bk9n2tuc1gmm13kkdt01jfq1r5o9.png-91.3kB

image_1bk9n3bqcifb2191ivjn8lesgm.png-75.5kB

这道题是写Binary Tree的序列化和反序列化。测试程序不会看你序列化后的结果,只会去验证你的程序序列化后的String再反序列化,是不是原来的树。

  1. public class Solution{
  2. public String serialize(TreeNode root){
  3. if (root == null) {
  4. return "{}";
  5. }
  6. ArrayList<TreeNode> queue = new ArrayList<>();
  7. queue.add(root);
  8. for (int i = 0; i < queue.size(); i++){
  9. TreeNode temp = queue.get(i);
  10. if (temp == null) {
  11. continue;
  12. }
  13. queue.add(root.left);
  14. queue.add(root.right);
  15. }
  16. while ( queue.get(queue.size() - 1) == null){
  17. queue.remove(queue.size() - 1);
  18. }
  19. StringBuilder sb = new StringBuilder;
  20. sb.append("{");
  21. for (int i = 0; i < queue.size(); i++) {
  22. if (queue.get(i) == null){
  23. sb.append(",#");
  24. } else {
  25. sb.append(",");
  26. sb.append(queue.get(i).val);
  27. }
  28. }
  29. sb.append("}");
  30. }
  31. public TreeNode deserialize(String data) {
  32. if (data.equals("{}")){
  33. return null;
  34. }
  35. String [] vals = data.substring(1,data.length - 1).split(",");
  36. ArrayList<TreeNode> queue = new ArrayList<TreeNode>();
  37. TreeNode root = new TreeNode(Integer.parseInt(vals[0]));
  38. queue.add(root);
  39. int index = 0;
  40. boolean isLeftChild;
  41. for (int i = 1; i < vals.length; i++){
  42. if (!vals[i].equals("#"){
  43. TreeNode node = new TreeNode(Integer.parseInt(vals[i]));
  44. if (isLeftChild){
  45. queue.get(i).left = node;
  46. } else {
  47. queue.get(i).right = node;
  48. }
  49. queue.add(node);
  50. }
  51. if (!isLeftChild( {
  52. index += 1;
  53. }
  54. isLeftChild = !isLeftChild;
  55. }
  56. return root;
  57. }
  58. }

想知道deserialize的时候,那个queue有什么用?
在群里问了一下为什么这道题看起来不像宽搜的模版,宽搜的模版不是都有

while (!queue.isEmpty())
queue.poll()

这一类常见code的吗?
然后有一个回答说他就是用的Queue, Solution里的代码选择用ArrayList是因为Queue里不能加null元素。并且我也觉得原答案想要用到ArrayList的get方法,这也是Queue没有的。但由于BFS的解题模版都是用的Queue,所以我很想学会这种写法。

image_1bkca9fat18n51i8b1lvn1kuufps9.png-31.1kB

  1. public class Codec {
  2. // Encodes a tree to a single string.
  3. public String serialize(TreeNode root) {
  4. if (root == null){
  5. return "{}";
  6. }
  7. Queue<TreeNode> queue = new LinkedList<TreeNode>();
  8. queue.offer(root);
  9. StringBuilder sb = new StringBuilder();
  10. sb.append("{");
  11. sb.append(root.val);
  12. while (!queue.isEmpty()){
  13. TreeNode node = queue.poll();
  14. if (node.left != null){
  15. sb.append(",");
  16. sb.append(node.left.val);
  17. queue.offer(node.left);
  18. } else{
  19. sb.append(",#");
  20. }
  21. if (node.right != null){
  22. sb.append(",");
  23. sb.append(node.right.val);
  24. queue.offer(node.right);
  25. } else {
  26. sb.append(",#");
  27. }
  28. }
  29. sb.append("}");
  30. return sb.toString();
  31. }
  32. // Decodes your encoded data to tree.
  33. public TreeNode deserialize(String data) {
  34. if (data.equals("{}")) {
  35. return null;
  36. }
  37. String [] vals = data.substring(1, data.length() - 1).split(",");
  38. TreeNode root = new TreeNode(Integer.parseInt(vals[0]));
  39. Queue<TreeNode> queue = new LinkedList<TreeNode>();
  40. queue.offer(root);
  41. while (!queue.isEmpty()) {
  42. for (int i = 1; i < vals.length; i += 2){
  43. TreeNode node = queue.poll();
  44. if(!vals[i].equals("#")){
  45. node.left = new TreeNode(Integer.parseInt(vals[i]));
  46. queue.offer(node.left);
  47. }
  48. if (i + 1 < vals.length && !vals[i + 1].equals("#")){
  49. node.right = new TreeNode(Integer.parseInt(vals[i+1]));
  50. queue.offer(node.right);
  51. }
  52. }
  53. }
  54. return root;
  55. }
  56. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注