【问题标题】:Saving a Binary tree to a file [closed]将二叉树保存到文件中[关闭]
【发布时间】:2013-11-29 02:58:26
【问题描述】:

我有一个非平衡(非二叉搜索)二叉树 需要将其编码(并稍后解码)为 txt 文件。 我怎样才能有效地做到这一点?

我找到了这个link 它谈到了类似(相同)的问题,但对我来说很明显

【问题讨论】:

  • 我会使用 XML 格式。它是存储树结构的一种自然方式。
  • 为什么不能使用您链接到的问题中给出的解决方案之一?另外,它必须是文本文件吗? (“高效”和“文本文件”并没有真正结合在一起)

标签: c++ c algorithm encoding binary-tree


【解决方案1】:

请看this on LeetCode

我喜欢这个解决方案,因为它相对高效并且可以生成光输出文件。

假设你有一棵这样的树:

    _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);
  }
}

正如我之前所说,此方法生成二叉树的轻量级表示。

当然它有一个严重的缺点:它需要一个符号来表示空节点。

如果树的节点是可以包含此符号本身的字符串,则可能会导致潜在问题。

【讨论】:

    猜你喜欢
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多