DFS 在 C++ 中的实施
DFS implementation in C++
我在下面写了代码。但是我不确定我是否正确插入了我的树。代码编译成功,但我在输出中没有得到 DFS 遍历数组。有人可以告诉我哪里出错了吗?
输入树在下面,但请让我知道我是否在 main 函数中进行了正确的调用?当我的输出即将到来时 - [a b c d e f g h i j k]。而正确的输出应该是 [a b e f i j c d g k h]。
A
/
B C D
/ /
E F G H
/
I J K
#include <bits/stdc++.h>
using namespace std;
class Node
{
public:
string name;
vector <Node *> children;
Node(string name)
{
this->name = name;
}
//O(v+e) time | O(v) space
vector <string> depthFirstSearch(vector<string> *array)
{
array->push_back(this->name);
for(size_t i = 0; i < this->children.size(); i++)
children[i]->depthFirstSearch(array);
return *array;
}
Node *addChild(string name)
{
Node *child = new Node(name);
children.push_back(child);
return this;
}
};
int main()
{
Node n1("a");
n1.addChild("b");
n1.addChild("c");
n1.addChild("d");
n1.children[0]->addChild("e");
n1.children[0]->addChild("f");
n1.children[0]->children[1]->addChild("i");
n1.children[0]->children[1]->addChild("j");
n1.children[2]->addChild("g");
n1.children[2]->addChild("h");
n1.children[2]->children[0]->addChild("k");
vector <string> array;
n1.depthFirstSearch(&array);
for (size_t i = 0; i< array.size(); i++)
cout<<array[i]<<' ';
}
注意 - 感谢您的解释,但我在 main 函数中构造树的方式进行了一些编辑,并继续使用 return 这个语句并且它起作用了。
错误实际上很简单,但不是预期的地方。
Node::addChild()
返回this
:
Node *addChild(string name)
{
Node *child = new Node(name);
children.push_back(child);
return this; // <-- OUCH!
}
因此,当用于main()
时:
Node n1("a");
Node *n2 = n1.addChild("b"); // => n2 = &n1;
n1.addChild("c");
Node *n4 = n1.addChild("d"); // => n4 = &n1;
n2->addChild("e");
Node *n3 = n2->addChild("f"); // => n3 = n2 = &n1;
n3->addChild("i");
n3->addChild("j");
Node *n5 = n4->addChild("g"); // => n5 = n4 = &n1;
n4->addChild("h");
n5->addChild("k");
因此,树实际上没有得到预期的形状,而是像这样:
A________________
/
B C D E F G H I J K
OP的电流输出完全正确。
修复很简单:
Node *addChild(string name)
{
Node *child = new Node(name);
children.push_back(child);
return child;
}
输出:
a b e f i j c d g k h
科里鲁的现场演示
OP坚持认为Node::addChild()
必须return this;
,并要求另一种方法来规避这个问题。我试图说服OPreturn child;
比return this;
更有意义。
实际上,我直觉地期望Node::addChild()
会返回创建的孩子,这花费了我一些额外的调试来找到实际的错误。
关于
我在主函数中构建树的方式 - 这是正确的方式还是可以更有效的方法
我个人认为main()
的代码并没有那么糟糕。
然而,通往罗马的路往往不止一条。
所以,这只是另一个想法:
显式构造子节点的第二个构造函数:
Node(Node &parent, string name): Node(name)
{
parent.children.push_back(this);
}
这允许将树初始化成这样main()
:
Node nA("a");
Node nB(nA, "b");
Node nC(nA, "c");
Node nD(nA, "d");
Node nE(nB, "e");
Node nF(nB, "f");
Node nI(nF, "i");
Node nJ(nF, "j");
Node nG(nD, "g");
Node nH(nD, "h");
Node nK(nG, "k");
(在这种情况下甚至不使用/不需要Node::addChild()
。
输出:
a b e f i j c d g k h
科里鲁的现场演示
相关文章:
- 实现 DFS 在较短的输入下工作正常,但在较大的输入下会抛出分段错误
- DFS 在 C++ 中的实施
- 在C++中使用双 DFS 查找树的直径
- 无法在基于 DFS 的任务排序程序中填充"stack"
- 矢量堆栈对 |使用 dfs 的树中的最长路径
- 在C++中实现 DFS 时出现分段错误
- 使用指针和引用,无法弄清楚为什么DFS无限重复
- DFS + 记忆解决方案在 LeetCode 上获取 TLE
- DFS在kefa和park中给予TLE(代码560C)
- 大型测试用例中C++ dfs 问题中的小错误
- 是平衡二进制树上预购和DFS的时间复杂性
- 使用 DFS 在图形中查找最低成本
- 在C++中实现图形 DFS,指针问题
- 使用非递归 DFS 检测有向图中的周期
- 无向DFS:如何提供颜色图作为外部特性
- 使用 ranges-v3 实现 DFS
- 我在DFS搜索(树)代码中遇到麻烦.我如何打破递归
- DFS 访问内部的地图元素.时间复杂度
- 使用BFS/DFS解决编程任务
- 我不理解这个dfs实现的语法