Sev*_*Sev 12 algorithm recursion binary-tree breadth-first-search
什么是最简单的方法,最好是使用递归,在BST(二进制搜索树)中找到最短的根到叶路径.Java首选,伪代码没关系.
谢谢!
Bri*_*ndy 15
一般说明:
使用广度优先搜索(BFS)而不是深度优先搜索(DFS).找到没有子节点的第一个节点.
使用DFS你可能会对一些输入树感到幸运(但是没有办法知道你很幸运,所以你仍然需要搜索整个树),但使用BFS方法要快得多,你可以找到一个解决方案而不需要全部节点.
要查找根到叶子路径,您可以使用父引用跟随第一个找到的无子节点一直返回到根.如果每个节点中都没有存储父引用,则可以在递归时跟踪父节点.如果您的列表顺序相反,则可以将其全部放在堆栈中然后将其弹出.
伪代码:
问题很简单; 这里是伪代码,以找到最小的长度:
在队列不为空时重复,但未找到任何结果:
找到所有最短路径:
要查找所有最短路径,您可以将节点的深度与节点内的节点一起存储.然后,您将继续使用相同深度的队列中所有节点的算法.
替代方案:
如果您决定使用DFS,则必须搜索整个树以找到最短路径.但是这可以通过保持目前为止最短的值来优化,并且只检查未来节点的深度,直到找到新的最短节点,或直到达到目前为止最短的节点.BFS是一个更好的解决方案.