java - 给定根节点和目标节点的二叉树之和是多少?

标签 java algorithm binary-tree

我有一个二叉树 作为函数输入,我有树根和 2 个节点 我需要沿着两个给定节点之间的路径计算总和。

一棵树的例子:

     4
   /   \
  8    13
 / \
24 45

代码:

List<Node> findPath(root, target):
if (root !=null)
    return
if root == node{
    return nodes.add(target)
}
path = findPath(root.left, target)
if (path !=null){
    return nodes.add(root).addAll(path)
}
path = findPath(root.right, target)
if (path!=null)
      return nodes.add(root).addAll(path)

如果我有目标节点的路径,我不知道下一步是什么,我应该如何计算最佳路径?

Input: sumTree(4, 24, 45)
Output: 8 + 24 + 45 = 77

Input: sumTree(4, 24, 13)
Output: 13 + 4 + 8 + 24 = 49

Input: sumTree(4, 4, 13)
Output: 4 + 13 = 17

Input: sumTree(4, 45, 45)
Output: 45

语言是JAVA,但语言并不重要,除非我理解语法 我只想有最佳解决方案。 是否可以提供一些伪代码?

最佳答案

您的两个路径将具有相同的前缀(至少根应该在那里)。 您需要删除公共(public)前缀并仅添加最后一个(最深的)公共(public)节点(一次)。对于不同的部分,您需要添加所有值。这应该是 O(N) 复杂度,并且与解决方案的其余部分一致。

您的搜索算法效率不高,因为您不断将值从一个列表复制到另一个列表(O(N^2) 如果您对树没有任何约束)。如果您修改它以就地构建响应,它应该变为 O(N)

关于java - 给定根节点和目标节点的二叉树之和是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54641020/

相关文章:

java - 为什么我使用这个二叉树的概率如此之大?

pointers - 比较 Golang 中的二叉树。我的回答错了

Java 在增加与添加一时未返回正确的树搜索结果

java - 如何在 Eclipse RCP 应用程序中使 View 可滚动?

java - EntityManager.remove() 不抛出预期的异常

java - 当我尝试在虚拟设备上启动它时出现 tictactoe 错误

c - 为什么我的冒泡排序实现打印了额外的数字?

java - 如何在您的代码中支持多个 android 版本?

c++ - 找到最小跳跃次数

c# - 如何获取两个平面网格的公共(public)部分?