LeetCode Problem

How to Solve All Ancestors of a Node in a Directed Acyclic Graph

This problem focuses on finding all ancestors of nodes in a Directed Acyclic Graph (DAG). To approach this, you can use graph traversal techniques such as Depth-First Search (DFS) or Breadth-First Search (BFS), combined with the concept of topological sorting. These strategies will allow you to process the graph efficiently and determine the ancestors for each node.

GhostInterview Help

Need help with All Ancestors of a Node in a Directed Acyclic Graph without spending extra time grinding it?

GhostInterview can read All Ancestors of a Node in a Directed Acyclic Graph from a screenshot, generate the answer path, explain the complexity, and support solver-first interview workflows when you need direct help fast.

Screenshot Input

Capture the prompt fast instead of rewriting the problem by hand.

Answer + Complexity

Get the solution path, trade-offs, and complexity summary in one pass.

Stealth Workflow

Stay outside captured layers on supported screen-share workflows.

Problem #2192Graph indegree plus topological orderingReviewed 2026-03-08
Difficulty
Medium
Primary pattern
Graph indegree plus topological ordering
Answer-first problem summary
Step-by-step approach and complexity
GhostInterview solver workflow

This problem focuses on finding all ancestors of nodes in a Directed Acyclic Graph (DAG). To approach this, you can use graph traversal techniques such as Depth-First Search (DFS) or Breadth-First Search (BFS), combined with the concept of topological sorting. These strategies will allow you to process the graph efficiently and determine the ancestors for each node.

Problem Statement

Given a Directed Acyclic Graph (DAG) with n nodes, each numbered from 0 to n-1, and a list of directed edges, your task is to find all ancestors for each node. A directed edge [from, to] indicates a path from node 'from' to node 'to'.

Return a list of lists, where each list contains the ancestors of the corresponding node in sorted order. For each node i, you must determine all nodes that can reach i through a directed path.

Examples

Example 1

Input: n = 8, edgeList = [[0,3],[0,4],[1,3],[2,4],[2,7],[3,5],[3,6],[3,7],[4,6]]

Output: [[],[],[],[0,1],[0,2],[0,1,3],[0,1,2,3,4],[0,1,2,3]]

The above diagram represents the input graph.

  • Nodes 0, 1, and 2 do not have any ancestors.
  • Node 3 has two ancestors 0 and 1.
  • Node 4 has two ancestors 0 and 2.
  • Node 5 has three ancestors 0, 1, and 3.
  • Node 6 has five ancestors 0, 1, 2, 3, and 4.
  • Node 7 has four ancestors 0, 1, 2, and 3.

Example 2

Input: n = 5, edgeList = [[0,1],[0,2],[0,3],[0,4],[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]]

Output: [[],[0],[0,1],[0,1,2],[0,1,2,3]]

The above diagram represents the input graph.

  • Node 0 does not have any ancestor.
  • Node 1 has one ancestor 0.
  • Node 2 has two ancestors 0 and 1.
  • Node 3 has three ancestors 0, 1, and 2.
  • Node 4 has four ancestors 0, 1, 2, and 3.

Constraints

  • 1 <= n <= 1000
  • 0 <= edges.length <= min(2000, n * (n - 1) / 2)
  • edges[i].length == 2
  • 0 <= fromi, toi <= n - 1
  • fromi != toi
  • There are no duplicate edges.
  • The graph is directed and acyclic.

Solution Approach

Graph Construction and Reverse Traversal

You can represent the graph as an adjacency list, then reverse the graph's edges. This transformation allows you to traverse the graph backward, gathering ancestors for each node.

Topological Sorting with DFS

Perform a topological sort of the graph, processing each node in order. For each node, traverse its ancestors by traversing the reversed graph using DFS, collecting all reachable nodes as ancestors.

Efficient Graph Traversal with BFS

Alternatively, use BFS to traverse the reversed graph. For each node, start from that node and propagate the ancestors upwards, collecting all ancestors and ensuring they are processed in ascending order.

Complexity Analysis

MetricValue
TimeO(n^2 + m)
SpaceO(n^2 + m)

The time complexity is O(n^2 + m) due to the graph traversal steps (where n is the number of nodes and m is the number of edges). The space complexity is O(n^2 + m) as well, considering the storage for graph representation and traversal.

What Interviewers Usually Probe

  • Ability to apply reverse graph traversal to collect ancestors.
  • Understanding of topological sorting and how it aids in graph processing.
  • Knowledge of BFS/DFS and their application in DAGs.

Common Pitfalls or Variants

Common pitfalls

  • Failing to reverse the graph before starting ancestor collection.
  • Not handling edge cases where nodes have no ancestors.
  • Inefficient traversal that leads to redundant computations for each node.

Follow-up variants

  • Consider how reversing the graph affects traversal and memory use.
  • Explore the trade-offs between DFS and BFS for this problem.
  • Test performance on larger graphs with up to 1000 nodes and 2000 edges.

How GhostInterview Helps

  • GhostInterview provides step-by-step guidance on solving the problem using the right traversal technique.
  • It highlights common mistakes, like missing reverse graph traversal or redundant searches.
  • GhostInterview helps you efficiently work through large inputs, ensuring optimal graph traversal strategies.

Topic Pages

FAQ

What is the best way to find ancestors in a DAG?

Reversing the graph and using topological sorting allows you to efficiently find ancestors using DFS or BFS.

How can I optimize the space complexity of this problem?

You can reduce space usage by only storing the necessary traversal data and using in-place modifications for graph traversal.

Why should I reverse the edges in this problem?

Reversing the edges makes it easier to traverse backward from each node, collecting ancestors efficiently.

What are the main challenges in this problem?

The main challenges include efficiently traversing the graph, handling large input sizes, and ensuring no redundant processing of nodes.

How do I use topological sorting in this problem?

Topological sorting orders the nodes in a way that makes it easy to process ancestors. By sorting the nodes before traversal, you ensure that all ancestors of a node are processed before the node itself.

GhostInterview Solver

Need direct help with All Ancestors of a Node in a Directed Acyclic Graph instead of spending more time grinding it?

Download GhostInterview when you want a LeetCode solver, not another long practice loop. Capture All Ancestors of a Node in a Directed Acyclic Graph from a screenshot, get the answer path and complexity, and use supported stealth workflows that stay outside captured layers.

Screenshot Input

Capture the prompt fast instead of rewriting the problem by hand.

Answer + Complexity

Get the solution path, trade-offs, and complexity summary in one pass.

Stealth Workflow

Stay outside captured layers on supported screen-share workflows.