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

时间:2016-05-19 04:16:11

标签: c++ recursion binary-search-tree inorder

我想通过使用字符串流和递归来打印二进制搜索树中所有节点的内容。问题是,当我使用此代码时,仅显示根的内容。我知道原因是每次递归调用函数InOrder(BSTNode * bst_node)时,我的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();
}

3 个答案:

答案 0 :(得分:3)

这样的事可能吗?

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

或者,你可以传递stringstream的同一个实例:

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

答案 1 :(得分:1)

简单:只需定义一个效用函数,其中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要有效得多(如果将效用函数定义为某些东西,则会发生这种情况)取一个节点并返回一个字符串)。

答案 2 :(得分:0)

我对此毫不掩饰 - 通过引用此方法将stringstream作为参数传递:

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

这应该有效。更好地定义函数外部的字符串流,并在调用函数时传递它。

修改

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