📖 Scenario: Imagine you are organizing a family reunion and want to represent family relationships and friendships among relatives. You want to understand the difference between a family tree and a friendship network.
🎯 Goal: You will build simple data structures to represent a tree (family tree) and a graph (friendship network) and observe their key structural differences.
📋 What You'll Learn
Create an adjacency list for a tree with 5 nodes representing family members
Create an adjacency list for a graph with 5 nodes representing friendships
Add a variable to count edges in both structures
Implement a function to print adjacency lists
Print the adjacency lists to observe differences
💡 Why This Matters
🌍 Real World
Trees are used to represent hierarchical data like family trees or file systems, while graphs represent networks like social connections or roads.
💼 Career
Understanding trees and graphs is essential for software development, data analysis, and network design roles.
Progress0 / 4 steps
1
Create adjacency list for a tree
Create a 2D integer array called tree with size [5][3] to represent adjacency lists for each node. Initialize it with these edges: node 0 connected to 1 and 2, node 1 connected to 3, node 2 connected to 4. Use arrays of integers terminated by -1 for each adjacency list.
DSA C
Hint
Use a 2D array where each row holds connected nodes ending with -1.
2
Create adjacency list for a graph
Add a 2D integer array called graph with size [5][3] to represent adjacency lists for each node. Initialize it with these edges: node 0 connected to 1 and 2, node 1 connected to 0 and 3, node 2 connected to 0 and 4, node 3 connected to 1 and 4, node 4 connected to 2 and 3. Use arrays of integers terminated by -1 for each adjacency list.
DSA C
Hint
Graph adjacency lists can have cycles, so nodes connect back and forth.
3
Add edge count variables
Add two integer variables: tree_edges set to 4, and graph_edges set to 5, representing the number of edges in the tree and graph respectively.
DSA C
Hint
Count edges manually based on connections in each structure.
4
Print adjacency lists
Write code to print the adjacency lists of tree and graph using a for loop with variable i from 0 to 4, and an inner for loop with variable j to print connected nodes until -1 is found. Print "Tree adjacency list:" before printing tree, and "Graph adjacency list:" before printing graph.
DSA C
Hint
Use nested loops to print each node's connections until -1 is reached.
Practice
(1/5)
1. Which of the following is a key structural difference between a graph and a tree?
easy
A. A graph is always directed, but a tree is always undirected.
B. A graph always has a root node, but a tree does not.
C. A tree has no cycles, but a graph can have cycles.
D. A tree can have multiple edges between the same nodes, but a graph cannot.
Solution
Step 1: Understand cycle presence in trees and graphs
A tree is a special type of graph that does not contain any cycles. Graphs, however, can have cycles.
Step 2: Analyze other options for correctness
Graphs do not always have a root node; trees do. Trees do not have multiple edges between the same nodes. Graphs can be directed or undirected, same as trees.
Final Answer:
A tree has no cycles, but a graph can have cycles. -> Option C
Quick Check:
Cycle presence = Tree no, Graph yes [OK]
Hint: Trees never have cycles; graphs can have cycles [OK]
Common Mistakes:
Thinking graphs always have a root node
Believing trees can have cycles
Confusing directed and undirected properties
2. Which of the following is the correct syntax to declare a tree node structure in C?
easy
A. typedef struct Node { int data; struct Node* left; struct Node* right; } Node;
B. struct Node { int data; Node* left; Node* right; };
C. typedef struct { int data; Node* left; Node* right; } Node;
D. struct Node { int data; struct Node left; struct Node right; };
Solution
Step 1: Check struct declaration with typedef and pointers
typedef struct Node { int data; struct Node* left; struct Node* right; } Node; correctly declares a struct Node with pointers to left and right child nodes and uses typedef for easy naming.
Step 2: Identify errors in other options
struct Node { int data; Node* left; Node* right; }; misses 'struct' keyword before Node* pointers. typedef struct { int data; Node* left; Node* right; } Node; lacks 'struct' keyword and uses Node* before typedef is complete. struct Node { int data; struct Node left; struct Node right; }; incorrectly uses struct Node instead of pointers, causing infinite size.
Final Answer:
typedef struct Node { int data; struct Node* left; struct Node* right; } Node; -> Option A
Quick Check:
Correct struct with pointers and typedef = typedef struct Node { int data; struct Node* left; struct Node* right; } Node; [OK]
Hint: Use 'struct' keyword before pointer types inside struct [OK]
Common Mistakes:
Omitting 'struct' keyword before pointers
Using struct members instead of pointers causing infinite size
Misplacing typedef syntax
3. Consider the following C code snippet representing a graph and a tree. What will be the output?
typedef struct Node {
int data;
struct Node* next;
} Node;
int main() {
Node a = {1, NULL};
Node b = {2, NULL};
Node c = {3, NULL};
// Creating a cycle in graph
a.next = &b;
b.next = &c;
c.next = &a;
// Tree-like structure
Node t1 = {1, NULL};
Node t2 = {2, NULL};
t1.next = &t2;
printf("Graph cycle start: %d\n", a.next->next->next->data);
printf("Tree next node: %d\n", t1.next->data);
return 0;
}
medium
A. Graph cycle start: 1
Tree next node: 2
B. Graph cycle start: 3
Tree next node: 1
C. Graph cycle start: 2
Tree next node: 3
D. Runtime error due to cycle
Solution
Step 1: Trace the graph cycle pointers
a.next points to b (2), b.next points to c (3), c.next points back to a (1). So a.next->next->next->data = a.data = 1.
Step 2: Trace the tree-like structure pointers
t1.next points to t2 (2), so t1.next->data = 2.
Final Answer:
Graph cycle start: 1
Tree next node: 2 -> Option A
Quick Check:
Cycle pointer loops back to 1, tree next is 2 [OK]
Hint: Follow pointers step-by-step to find data [OK]
Common Mistakes:
Assuming cycle causes runtime error
Miscounting pointer jumps
Confusing graph and tree pointer usage
4. The following C code attempts to create a tree node but has an error. What is the error?
D. Using struct Node instead of pointers causes infinite size
Solution
Step 1: Analyze struct member types
Members left and right are declared as struct Node, not pointers. This causes the struct to contain itself infinitely, making size undefined.
Step 2: Understand correct tree node declaration
Tree nodes must have pointers to children, e.g., struct Node* left; struct Node* right; to avoid infinite size.
Final Answer:
Using struct Node instead of pointers causes infinite size -> Option D
Quick Check:
Struct members must be pointers to avoid infinite recursion [OK]
Hint: Use pointers for child nodes in tree struct [OK]
Common Mistakes:
Thinking initialization is wrong
Ignoring infinite size issue
Assuming code compiles without error
5. You are given a graph represented by adjacency lists. Which of the following conditions must be true for this graph to be a tree?
hard
A. The graph must be disconnected and have fewer than n-1 edges.
B. The graph must be connected and have exactly n-1 edges for n nodes.
C. The graph must have cycles and at least n edges for n nodes.
D. The graph must have multiple edges between nodes.
Solution
Step 1: Recall tree properties in graph theory
A tree is a connected graph with no cycles and exactly n-1 edges for n nodes.
Step 2: Evaluate each option against tree definition
The graph must be connected and have exactly n-1 edges for n nodes. matches the definition. The graph must have cycles and at least n edges for n nodes. is wrong because trees have no cycles. The graph must be disconnected and have fewer than n-1 edges. is wrong because trees are connected. The graph must have multiple edges between nodes. is wrong because trees do not have multiple edges between nodes.
Final Answer:
The graph must be connected and have exactly n-1 edges for n nodes. -> Option B
Quick Check:
Connected + n-1 edges = Tree [OK]
Hint: Tree = connected graph with n-1 edges [OK]
Common Mistakes:
Thinking trees can have cycles
Assuming disconnected graphs are trees
Confusing edge count for trees
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.