java - 给定根节点和目标节点的二叉树的总和是多少?
问题描述
我有一个二叉树作为函数输入我有树根和 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,但语言并不重要,除非我理解我只想获得最佳解决方案的语法。是否可以提供一些伪代码?
解决方案
您的两条路径将具有相同的前缀(至少根应该在那里)。您需要删除公共前缀并仅添加最后一个(最深的)公共节点(一次)。对于不同的部分,您需要添加所有值。这应该是O(N)
复杂的,并且与解决方案的其余部分一致。
您的搜索算法效率不高,因为您不断将值从一个列表复制到另一个列表(O(N^2)
如果您对树没有任何约束)。如果您修改它以在适当的位置构建响应,它应该变为O(N)
.
推荐阅读
- matlab - Running a for loop through 5 data structs
- c# - C# Setting a value in a single element of a multi-level array is setting the value in every element
- python - Pandas - 应用蒙版时加快模式计算
- python - 我可以将预训练的 pdf 函数传递给 seaborn.distplot 吗?
- java - android - How to parse SMS textview
- python-3.x - 这个算法的时间复杂度是多少(解决 leetcode 问题 650)?
- javascript - 我的 Bootstrap 模式需要点击两次才能打开
- python - 循环尝试将数据提取到新数据集中的字典给出未定义的错误名称
- r - r 通过迭代数字过滤器将数据帧拆分为列表
- powershell - 如何使用 powershell 在目录中搜索文件名?