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
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
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.