Design an algorithm and write code to serialize and deserialize a binary tree. Writing the tree to a file is called ‘serialization’ and reading back from the file to reconstruct the exact same binary tree is ‘deserialization’.
Approach 1.
========
Convert the given BST into a doubly linked list in O(n) and then send the linked list over the channel.
Note:: See Blog Convert tree into linked list in O(n) using tree rotations.
Once you recieve the tree then again convert back the linked list to tree. I haven't done this yet in O(n); however there is a post avaiabe; if you have a solution for second case please do post.
Approach 2
========
1. Take the preorder traversal of the tree; write it to a file and send it over the channel. This would be done using O(n).
Since you have to traverse the tree to save the nodes.
Possible traversals are inorder, preorder, postorder and level order.
If we do an inorder traversal then we would get a sorted list which if we convert into a BST would again become a list and we would loose out on the original structure of the tree.
Postorder traversal would also not give back the original tree; a simple example can let you know.
Now left out are preorder and level order traversal.
Both give us the output; but level order will require more space as it uses BFS approach. So we do a preorder traversal of the tree store it in a file in O(n) and send it over the channel.
On the recieving end we recieve and construct the tree back in O(n log(n)); by inserting each and every node in the preorder list into the new list using the property of BST results the same tree....
class TreeNode{ int val; TreeNode left, right; TreeNode(int val){ this.val = val; } } public String serialize(TreeNode root){ StringBuilder sb = new StringBuilder(); serialize(root, sb); return sb.toString(); } private void serialize(TreeNode x, StringBuilder sb){ if (x == null) { sb.append("# "); } else { sb.append(x.val + " "); serialzie(x.left, sb); serialzie(x.right, sb); } } public TreeNode deserialize(String s){ if (s == null || s.length() == 0) return null; StringTokenizer st = new StringTokenizer(s, " "); return deserialize(st); } private TreeNode deserialize(StringTokenizer st){ if (!st.hasMoreTokens()) return null; String val = st.nextToken(); if (val.equals("#")) return null; TreeNode root = new TreeNode(Integer.parseInt(val)); root.left = deserialize(st); root.right = deserialize(st); return root; }
References:
http://www.geeksforgeeks.org/serialize-deserialize-binary-tree/
http://www.cs.usfca.edu/~galles/cs245/lecture/lecture9.pdf
相关推荐
java java_leetcode-107-binary-tree-level-order-traversal
java java_leetcode-102-binary-tree-level-order-traversal
java java_leetcode-110-balanced-binary-tree
java java_leetcode-99-recover-binary-search-tree
java java_leetcode-114-flatten-binary-tree-to-linked-list
java java_leetcode-maximum-depth-of-binary-tree
java java_leetcode-105-construct-binary-tree-from-preorder-and-inorde
java java_leetcode-111-minimum-depth-of-binary-tree
java java_leetcode-101-symmetric-tree
java java_leetcode-100-same-tree
c c语言_leetcode题解之0297_serialize_and_deserialize_binary_tree
python python_leetcode_109_Convert_Sorted_List_to_Binary_Search_Tree
java java_leetcode题解之Maximum Binary Tree.java
java java_leetcode题解之Maximum Binary Tree II.java
java java_leetcode题解之Construct Binary Tree from String.java
《在IDE中高效进行LeetCode练习:leetcode-editor的深度解析》 在编程学习与技能提升的过程中,LeetCode作为一款广受欢迎的在线编程挑战平台,帮助众多开发者锻炼算法思维,提高编程能力。而为了进一步提升练习体验...
c语言入门 c语言_leetcode题解543-diameter-of-binary-tree.c
leetcode-习题集资源leetcode-习题集资源leetcode-习题集资源leetcode-习题集资源leetcode-习题集资源leetcode-习题集资源
leetcode-cli-plugins leetcode-cli 的第 3 方插件。 什么是 如何使用 如何使用 插件 名称 描述 增强的命令 按公司或标签过滤问题 list 不要在同一台计算机上使 Chrome 的会话过期 login 不要在同一台计算机上使 ...