【发布时间】:2017-11-14 23:51:01
【问题描述】:
给定一个有向无环图,确定是否有任何分支返回等于 22 的路径和。在下面的示例中,可以在 (7 + 8 + 3 + 4) 处找到这样的路径。这种算法的运行时间复杂度是多少?
7
/ \
8 6
/ \ / \
2 3 8
/ / \
5 4 1
这就是我想出的。
public boolean hasPathToSum(Node root, int sum)
{
if (root == null) return false;
if (root.value == sum && (root.left == null && root.right == null))
return true;
return hasPathToSum(root.left, sum - root.value) || hasPathToSum(root.right, sum - root.value);
}
关于提高复杂性有什么更好的建议吗?
【问题讨论】:
-
数据结构看起来更像二叉树而不是图(节点有
left&right而不是边列表)。在这种情况下,复杂度为O(n),其中n是树中的节点总数,因为您正在访问每个节点。 -
如果它是一棵树,则可以在
O(n)中进行广度优先遍历。可以在O(n^2)中遍历森林。 -
并非如此,即使在这个简单的示例中,节点“3”也被访问了两次。
-
哦,我没看到
3有两个父母。没错,它是 DAG,而不是二叉树。 -
最坏的情况是一个图,其中深度
i上的每个节点都连接到深度i+1上的每个节点。我认为这需要O(n^2)广度优先遍历。
标签: java algorithm data-structures graph tree