【发布时间】:2013-11-29 02:58:26
【问题描述】:
【问题讨论】:
-
我会使用 XML 格式。它是存储树结构的一种自然方式。
-
为什么不能使用您链接到的问题中给出的解决方案之一?另外,它必须是文本文件吗? (“高效”和“文本文件”并没有真正结合在一起)
标签: c++ c algorithm encoding binary-tree
【问题讨论】:
标签: c++ c algorithm encoding binary-tree
我喜欢这个解决方案,因为它相对高效并且可以生成光输出文件。
假设你有一棵这样的树:
_30_
/ \
10 20
/ / \
50 45 35
此解决方案可让您将其序列化为这样的输出文本文件:
30 10 50 # # # 20 45 # # 35 # #
要做到这一点,通过树执行简单的前序遍历就足够了:
void writeBinaryTree(BinaryTree *p, ostream &out) {
if (!p) {
out << "# ";
} else {
out << p->data << " ";
writeBinaryTree(p->left, out);
writeBinaryTree(p->right, out);
}
}
如您所见,# 符号用于表示空节点。
要将此字符串反序列化为树,您可以使用:
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);
}
}
正如我之前所说,此方法生成二叉树的轻量级表示。
当然它有一个严重的缺点:它需要一个符号来表示空节点。
如果树的节点是可以包含此符号本身的字符串,则可能会导致潜在问题。
【讨论】: