`

LeetCode - Serialize a binary tree

 
阅读更多

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

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics