7

I have a non-balanced (not binary-search) binary tree Need to incode (and later decode) it to txt file. How can I do it in efficient way?

I found this link which talks about similar (same) problem,but it is obvious for me

Community
  • 1
  • 1
YAKOVM
  • 9,805
  • 31
  • 116
  • 217
  • 1
    I would use a XML format. Its a natural way to store a tree structure. – andre Nov 15 '13 at 16:30
  • 1
    Why can't you use one of the solutions given in the question your linked to? Also, does it have to be a text file? ("efficient" and "text file" don't really go together) – harold Nov 15 '13 at 16:38

1 Answers1

12

Please look at this on LeetCode.

I like this solution because it's relatively efficient and produces light output files.

Assuming that you've got a tree like this:

    _30_ 
   /    \    
  10    20
 /     /  \ 
50    45  35

This solution lets you serialize it to such an output text file:

30 10 50 # # # 20 45 # # 35 # #

To do this it's enough to perform simple pre-order traversal through the tree:

void writeBinaryTree(BinaryTree *p, ostream &out) {
  if (!p) {
    out << "# ";
  } else {
    out << p->data << " ";
    writeBinaryTree(p->left, out);
    writeBinaryTree(p->right, out);
  }
}

As you can see, a # symbol is used to represent the null node.

To deserialize this string into a tree you can use:

void readBinaryTree(BinaryTree *&p, ifstream &fin) {
  int token;
  bool isNumber;
  if (!readNextToken(token, fin, isNumber)) 
    return;
  if (isNumber) {
    p = new BinaryTree(token);
    readBinaryTree(p->left, fin);
    readBinaryTree(p->right, fin);
  }
}

As I said before, this method produces a lightweight representation of Binary Tree.

Of course it has one serious drawback: it requires a symbol to represent the null node.

It can cause potential problems if the nodes of tree are strings that can contain this symbol itself.

Bernhard Barker
  • 54,589
  • 14
  • 104
  • 138
Zegar
  • 1,005
  • 10
  • 18