【问题标题】:Given a binary search tree and a number, find a path whose node's data added to be the given number.给定一个二叉搜索树和一个数字,找到一个路径,其节点的数据添加为给定数字。
【发布时间】:2012-01-29 09:24:21
【问题描述】:

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

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

如果我们每次从根迭代到叶子,就会有重叠,因为有些路径可能有重叠。

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

谢谢

【问题讨论】:

  • 有几种递归方式。你用的是哪一个?你说“所有数字”,但你没有说这些数字在哪里,在边缘,还是在节点中。

标签: c++ algorithm tree binary-tree binary-search


【解决方案1】:

基本上这个问题可以通过在树上使用动态规划来解决,以避免那些重叠的路径。

基本思想是在表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].

这是二叉树的情况,但很容易将其扩展到非二叉树的情况。

如果有什么不清楚的地方,欢迎评论。

【讨论】:

    【解决方案2】:

    任何你可以递归地做的事情,你也可以迭代地做。但是,递归解决方案没有性能问题,那么我将保持原样。如果您尝试迭代地进行编码/阅读,可能会更难编码/阅读。

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

    【讨论】:

    • 如果树不平衡,我们可能在递归中出现堆栈溢出。因此,优选迭代解决方案。但是,我仍然无法理解你的算法。你能用伪代码说吗?谢谢
    【解决方案3】:

    对于 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 以不再遍历相同的路径并使用先前计算的总距离。想到的算法有点复杂,抱歉没时间写。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-22
      • 2021-09-26
      • 1970-01-01
      • 2021-11-24
      • 2021-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多