如何使用stringstream C++递归打印出二叉搜索树中的所有节点

How to recursively print out all the nodes in a binary search tree using stringstream C++

我想使用字符串流和递归来打印二叉搜索树中所有节点的内容。问题是当我使用这段代码时,只显示根目录的内容。我知道原因是每次我递归调用函数 InOrder(BSTNode* bst_node) 时,都会再次创建我的 stringstream 变量。我可以对我的代码做些什么来解决这个问题,同时仍然使用 stringstream 进行输出?

这是我的代码:

string BSTree::InOrder(BSTNode* bst_node) {
  stringstream ss;
  if (root_ ==  NULL) {
    return "";
  } else {
    if (bst_node->GetLeftChild() != NULL) {
      InOrder(bst_node->GetLeftChild());
    }
    ss << bst_node->GetContents() << " ";
    if (bst_node->GetRightChild() != NULL) {
      InOrder(bst_node->GetRightChild());
    }
  }
  return ss.str();
}

也许是这样的?

string BSTree::InOrder(BSTNode* bst_node)
{
  if (!bst_node)
    return "";
  ostringstream ss;
  ss << InOrder(bst_node->GetLeftChild());
  ss << bst_node->GetContents() << " ";
  ss << InOrder(bst_node->GetRightChild());
  return ss.str();
}

或者,您可以传递相同的字符串流实例:

void BSTree::InOrderImpl(BSTNode* bst_node, ostringstream &ss)
{
  if (bst_node)
  {
    InOrderImpl(bst_node->GetLeftChild(), ss);
    ss << bst_node->GetContents() << " ";
    InOrderImpl(bst_node->GetRightChild(), ss);
  }
}

string BSTree::InOrder(BSTNode* bst_node)
{
  ostringstream ss;
  InOrder(bst_node, ss);
  return ss.str();
}

我对此毫不费力 - 通过引用此方法将字符串流作为参数传递:

static stringstream existingSSreference;
string BSTree::InOrder(BSTNode* bst_node, stringstream & ss = existingSSreference) {

  if (root_ ==  NULL) {
    return "";
  } else {
    if (bst_node->GetLeftChild() != NULL) {
      InOrder(bst_node->GetLeftChild(), ss);
    }
    ss << bst_node->GetContents();
    if (bst_node->GetRightChild() != NULL) {
      InOrder(bst_node->GetRightChild(), ss);
    }
  }
  return ss.str();
}

并且您想要在使用方法之前声明字符串流:

stringstream ss;
string myResult = bstreeObj->InOrder(bstNode, ss);

或者不传就直接使用

string myResult = bstreeObj->InOrder(bstNode);

这应该有效。最好在函数外定义stringstream,调用函数时传递。

编辑

正如 Ajay 所指出的,引用参数不能有默认值,除非我们传递一个实际存在的实例作为默认值(这样我们就可以保留省略第二个参数的可能性)。

简单:只需定义一个效用函数,其中 stringstream 作为参数传递:

void BSTree::InOrder(BSTNode *root, std::stringstream &ss)
{
  if (root == nullptr) { return; }
  InOrder(root->GetLeftChild(), ss)
  ss << root->GetContents() << " ";
  InOrder(root->GetRightChild(), ss)
}

string BSTree::InOrder(BSTNode* bst_node) {
  stringstream ss;
  InOrder(bst_node, ss);
  return ss.str();
}

请注意,仅实例化一个 stringstream 来转储整个树可能比为树的每个节点实例化一个 stringstream 更有效(如果您定义效用函数,就会发生这种情况)作为获取节点并返回字符串的东西)。