我的书中有以下伪代码用于广度优先搜索:
function breadth_first_search:
begin
open := [Start]
closed := [];
while open != [] do
begin
remove leftmost state from open, call it X;
if X is a goal then return SUCCESS
else begin
generate children of X;
put X on closed;
discard children of X if already on open or closed;
put remaining children on right end of open;
end
end
return FAIL;
end
我自己遵循这些伪代码指令实现了类似的算法。我的问题是,修改它的最简单方法是什么,以便维护解决方案路径?
简单地知道我可以找到解决方案并不像拥有转换列表那样有用。
答案 0 :(得分:6)
在排队每个节点时设置Parent[childNode] = currentNode
(当您设置Visible[Node] = 1
时)。
然后从您想要的节点开始递归查找Parent
数组,并将您在Parent
数组中看到的每个节点附加到路径中。 Parent[root]
为nil
,递归将停在那里。
答案 1 :(得分:3)
您是否有可能更改树结构?如果是这样,您可能希望在每个节点/叶子中添加一个parent
指针,这样当您找到解决方案时,您将跟随父指针一直到根。