繁体   English   中英

给定二叉搜索树和一个数字,找到一条路径,该路径的节点数据已添加为给定数字。

[英]Given a binary search tree and a number, find a path whose node's data added to be the given number.

给定一个二叉搜索树和一个数字,查找是否存在从根到叶的路径,以使路径上的所有数字加起来成为给定的数字。

我知道如何通过递归来做到这一点。 但是,我更喜欢迭代解决方案。

如果我们每次从根到叶进行迭代,都会重叠,因为某些路径可能重叠。

如果树不是二分查找怎么办?

谢谢

基本上,可以通过在树上进行动态编程来避免这些重叠的路径来解决此问题。

基本思想是跟踪表f[node]从每个叶子到给定节点的可能长度。 如果我们在二维布尔数组中实现它,则类似于f[node][len] ,它指示是否存在从叶到node的路径,其长度等于len 我们还可以使用vector<int>将值存储在每个f[node]而不是使用布尔数组。 无论您使用哪种表示形式,不同f之间的计算方式都非常简单,形式为

f[node] is the union of f[node->left] + len_left[node] and f[node->right] + len_right[node].

二叉树就是这种情况,但是将其扩展到非二叉树情况确实很容易。

如果有任何不清楚的地方,请随时发表评论。

您可以递归执行的任何操作,也可以迭代执行。 但是,递归解决方案没有性能问题,那么我将保持现状。 如果您尝试迭代地进行编码/读取,则很有可能会变得更加困难。

但是,如果您坚持要这样做,则可以使用堆栈将递归解决方案转换为迭代解决方案。 每次进行递归调用时,请将当前函数调用中的状态变量推入堆栈。 完成调用后,弹出变量。

对于BST:

Node current,final = (initialize)
List nodesInPath;
nodesInPath.add(current);
while(current != final) {
    List childrenNodes = current.children;
    if(noChildren) noSolution;
    if(current < final) {
        //choose right child if there is one, otherwise no solution
        current = children[right];
    } else if(current > final){
        //choose left child if there is one, otherwise no solution
        current = children[left];         
    } 
    nodesInPath.add(current);
}
check sum in the nodesInPath

但是,对于非BST,您应该应用动态编程的解决方案,如derekhh建议,如果您不想一遍又一遍地计算相同的路径。 我认为,您可以存储某个已处理节点和根节点之间的总长度。 您可以在展开距离时计算距离。 然后,您将应用Breadth-first search ,以免再次遍历相同的路径并使用先前计算的总距离。 我想到的算法有点复杂,很抱歉,但没有足够的时间来编写它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM