DFS递归树,需要帮助访问的问题
DFS Recursion of a Tree, need assistance with visited issue
我在尝试导航包含循环的树时遇到了问题。我的代码进入无限循环,核心转储。我的问题是,我的代码没有设置节点访问后,实际访问他们,所以它只是永远循环。如有任何帮助,不胜感激。
#include "GraphCode.h"
//#define EBUG
/******************************************************************************
static const string TAG = "GraphCode: ";
/******************************************************************************
* Constructor
**/
GraphCode::GraphCode()
{
}
/******************************************************************************
* Destructor
**/
GraphCode::~GraphCode()
{
}
/******************************************************************************
* Accessors and Mutators
**/
/******************************************************************************
* General functions.
**/
/******************************************************************************
* Function 'createGraph'.
* We read data from the input stream and create a graph.
*
* Parameter:
**/
void GraphCode::createGraph(Scanner& inStream)
{
int nodeCount = -10;
double connectivity = -3.5;
MyRandom myRandom;
#ifdef EBUG
#endif
cout << TAG << "enter createGraphn";
if (inStream.hasNext())
{
nodeCount = inStream.nextInt();
connectivity = inStream.nextDouble();
cout << TAG << "Create a graph of " << nodeCount
<< " nodes and " << connectivity << " percent connections"
<< endl;
}
else
{
cout << TAG << "NO DATAn";
}
// first we create the vector of empty nodes
for (int fromNum = 0; fromNum < nodeCount; ++fromNum)
{
Node node = Node(fromNum);
this->theGraph.push_back(node);
}
// now we have a vector so we know we can subscript
for (int fromNum = 0; fromNum < nodeCount; ++fromNum)
{
Node node = this->theGraph.at(fromNum);
for (int toNum = 0; toNum < nodeCount; ++toNum)
{
if (fromNum == toNum) continue;
double r = myRandom.randomUniformDouble(0.0, 1.0);
if (r <= connectivity)
{
node.addChildSub(toNum);
}
}
this->theGraph[fromNum] = node;
}
#ifdef EBUG
#endif
cout << TAG << "leave createGraph " << nodeCount << " " << connectivity << endl;
} // void GraphCode::createGraph(Scanner& inStream)
/******************************************************************************
* Function 'descendFrom'.
**/
void GraphCode::descendFrom(ofstream& outStream, string blanks, Node& parentNode)
{
#ifdef EBUG
cout << blanks << TAG << "enter descendFromn" << this->toStringPath(blanks) << endl;
#endif
vector<int> listOfChildren = parentNode.getChildSubs();
vector<int>::const_iterator iter;
if (parentNode.hasBeenVisited() == false)
{
path.push_back(Utils::Format(parentNode.getNodeNumber()));
parentNode.setVisited(true);
if (listOfChildren.empty())
{
outStream << "Path""n" << toStringPath(blanks) << endl;
path.pop_back();
}
else
{
for (iter = listOfChildren.begin(); iter != listOfChildren.end(); iter++)
{
Node& n = theGraph.at(*iter);
descendFrom(outStream, blanks, n);
}
path.pop_back();
}
}
#ifdef EBUG
cout << blanks << TAG << "leave descendFromn";
#endif
} // GraphCode::descendFrom()
/******************************************************************************
* Function 'doSearch'.
**/
void GraphCode::doSearch(ofstream& outStream)
{
#ifdef EBUG
cout << TAG << "enter doSearchn";
#endif
Node& node = theGraph.at(0);
string blanks = " ";
descendFrom(outStream, blanks, node);
#ifdef EBUG
cout << TAG << "leave doSearchn";
#endif
} // void GraphCode::doSearch()
/******************************************************************************
* Function 'readGraph'.
**/
void GraphCode::readGraph(Scanner& inStream)
{
ScanLine scanLine;
#ifdef EBUG
cout << TAG << "enter readGraphn";
#endif
int firstNode, lastNode;
firstNode = inStream.nextInt();
lastNode = inStream.nextInt();
assert ( 0 == firstNode);
for(int i = 0; i <= lastNode; ++i)
{
Node node = Node(i);
this->theGraph.push_back(node);
}
while (inStream.hasNext())
{
string theLine = inStream.nextLine();
scanLine.openString(theLine);
int parentNodeNum = scanLine.nextInt();
Node node = this->theGraph.at(parentNodeNum);
while( scanLine.hasNext())
{
int theChild = scanLine.nextInt();
node.addChildSub(theChild);
}
this->theGraph.at(parentNodeNum) = node;
}
#ifdef EBUG
cout << TAG << "leave readGraph " << endl;
#endif
} // void GraphCode::readGraph(Scanner& inStream)
/******************************************************************************
* Function 'toString'.
**/
string GraphCode::toString()
{
Node node;
string s = " ";
#ifdef EBUG
cout << TAG << "enter toStringn";
#endif
vector<Node>::const_iterator iter;
for (iter = theGraph.begin(); iter != theGraph.end(); iter++)
{
node = *iter;
s += "Node: (" + node.toString() + ")" + "n";
}
#ifdef EBUG
cout << TAG << "leave toStringn";
#endif
return s;
} // string GraphCode::toString()
/******************************************************************************
* Function 'toStringChildren'.
**/
string GraphCode::toStringChildren(string blanks, const vector<int>& children)
{
string s = "";
#ifdef EBUG
cout << TAG << "enter toStringChildrenn";
#endif
Node node;
vector<int>::const_iterator iter;
for (iter = children.begin(); iter != children.end(); ++iter)
{
s += Utils::Format((*iter), 6);
}
#ifdef EBUG
cout << TAG << "leave toStringChildrenn";
#endif
return s;
} // string GraphCode::toStringChildren()
/******************************************************************************
* Function 'toStringPath'.
**/
string GraphCode::toStringPath(string blanks)
{
string s = " ";
#ifdef EBUG
cout << TAG << "enter toStringPathn";
#endif
Node node;
for (int index = 0; index < this->path.size(); ++index)
{
s += this->path.at(index) + "n" + blanks;
}
s += "LEAFn";
#ifdef EBUG
cout << TAG << "leave toStringPathn";
#endif
return s;
} // string GraphCode::toStringPath()
//预期的输出:
//PATH TO LEAF
// PATH ( 0: T 1 2 6 9 XXX)
//From ( 1: T XXX)
// LEAF
//PATH TO LEAF
//PATH ( 0: T 1 2 6 9 XXX)
//From ( 2: T 3 4 5 XXX)
//From ( 3: T XXX)
//LEAF
//my output:
//Path
// 0
// 1
// LEAF
//Path
// 0
// 2
// 3
// LEAF
我让我的打印路径正确但是我不能让'T'(基本上调用parentNode.toString())和子元素与路径
void Node::setVisited(bool what)
{
what = visited;
}
这个赋值是反向的。你是指
visited = what;
相关文章:
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 用于访问容器<T>数据成员的正确 API
- 访问者访问变体并返回不同类型时出错
- 尝试通过多个向量访问变量时,向量下标超出范围
- 无法访问嵌套类.类的使用无效
- 需要帮助设置在C++中使用的Potrace
- 写入位置0x0000000C时发生访问冲突
- 我们可以访问一个不存在的联盟的成员吗
- C++从另一个类访问公共静态向量的正确方法是什么
- 我的简单if-else语句是如何无法访问的代码
- 在指针的帮助下,文本文件中单词的频率
- 从C++dll访问C#中的一行主要参数
- 概念TS检查忽略私有访问修饰符
- 指针帮助:取消指向访问其内部数据的结构的指针
- 我无法弄清楚此访问冲突错误.有人可以在这里帮助我吗?
- 访问冲突帮助c++
- 需要帮助模板化多线程访问的结构
- DFS递归树,需要帮助访问的问题