[英]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.