Why Trees Exist and What Linked Lists and Arrays Cannot Do
📖 Scenario: Imagine you are organizing a company's employee directory. You want to store employees so you can quickly find who reports to whom, and also find employees by their ID efficiently. You first tried using a list and then an array, but both had problems when the company grew.
🎯 Goal: You will create a simple tree structure in Go to represent employees and their direct reports. This will show why trees are useful and what linked lists and arrays cannot do well.
📋 What You'll Learn
Create a struct called Employee with fields id int and reports []*Employee
Create a root employee with id 1
Add two direct reports with ids 2 and 3 to the root employee
Add one direct report with id 4 to the employee with id 2
Print the tree structure showing each employee and their direct reports
💡 Why This Matters
🌍 Real World
Trees are used in many real-world applications like file systems, organizational charts, and website menus where data is hierarchical.
💼 Career
Understanding trees helps in software engineering roles that deal with complex data structures, databases, and efficient data retrieval.
Progress0 / 4 steps
1
Create the Employee struct and root employee
Create a struct called Employee with fields id int and reports []*Employee. Then create a variable called root of type *Employee with id 1 and an empty reports slice.
DSA Go
Hint
Define the struct with the fields exactly as stated. Then create root as a pointer to Employee with id: 1 and an empty slice for reports.
2
Add direct reports to the root employee
Create two new Employee pointers with id 2 and 3 and empty reports slices. Add them to the reports slice of the root employee.
DSA Go
Hint
Create two new employees with ids 2 and 3 and add them to root.reports using append.
3
Add a direct report to employee with id 2
Create a new Employee pointer with id 4 and empty reports slice. Add it to the reports slice of the employee with id 2 (which is emp2).
DSA Go
Hint
Create employee 4 and append it to emp2.reports.
4
Print the tree structure showing employees and their reports
Write a function called printEmployee that takes an *Employee and an int level for indentation. It prints the employee's id with indentation, then recursively prints all direct reports with increased indentation. Call printEmployee(root, 0) in main to display the tree.
DSA Go
Hint
Use recursion to print each employee with indentation showing the tree structure. Call printEmployee(root, 0) in main.
Practice
(1/5)
1. Why do trees exist as a data structure when we already have linked lists and arrays?
easy
A. Because trees allow hierarchical data representation which arrays and linked lists cannot efficiently provide
B. Because trees use less memory than arrays and linked lists
C. Because trees are easier to implement than arrays and linked lists
D. Because trees always provide faster access than arrays and linked lists
Solution
Step 1: Understand the limitation of arrays and linked lists
Arrays and linked lists store data in a linear sequence, which makes representing hierarchical relationships difficult.
Step 2: Identify the advantage of trees
Trees allow data to be stored in a hierarchy, like a family tree or file system, which arrays and linked lists cannot efficiently represent.
Final Answer:
Trees allow hierarchical data representation which arrays and linked lists cannot efficiently provide -> Option A
Quick Check:
Hierarchical data needs trees = B [OK]
Hint: Trees represent hierarchy; arrays and lists are linear [OK]
Common Mistakes:
Thinking trees always use less memory
Assuming trees are easier to implement
Believing trees always have faster access
2. Which of the following is the correct way to declare a simple binary tree node struct in Go?
easy
A. type Node struct { value int; left *Node; right *Node }
B. type Node struct { value int; left Node; right Node }
C. type Node struct { value int; left *int; right *int }
D. type Node struct { value int; left int; right int }
Solution
Step 1: Understand pointer usage in tree nodes
Each node's left and right children must be pointers to other nodes to allow recursive structure.
Step 2: Check each option's correctness
type Node struct { value int; left *Node; right *Node } uses pointers to Node for left and right, which is correct. type Node struct { value int; left Node; right Node } uses Node directly, causing infinite size. Options C and D use incorrect types for children.
Final Answer:
type Node struct { value int; left *Node; right *Node } -> Option A
Quick Check:
Tree nodes use pointers to child nodes = A [OK]
Hint: Tree children must be pointers to nodes in Go [OK]
Common Mistakes:
Using non-pointer types for child nodes
Using primitive types instead of node pointers
Forgetting semicolons or commas in struct
3. You want to represent a company's organizational chart where each manager can have multiple direct reports. Why is a tree a better choice than arrays or linked lists for this structure?
easy
A. Because trees use less memory than arrays and linked lists
B. Because arrays can only store numbers, not objects
C. Because linked lists cannot store more than two elements
D. Because trees can represent multiple levels of hierarchy and branching relationships naturally
Solution
Step 1: Understand the organizational chart structure
It has multiple levels and each manager can have many direct reports, forming a branching hierarchy.
Step 2: Compare data structures for hierarchy representation
Arrays and linked lists are linear and cannot naturally represent multiple branches and levels. Trees model this branching well.
Step 3: Confirm why other options are incorrect
Arrays can store objects, linked lists can store many elements, and trees do not necessarily use less memory.
Final Answer:
Because trees can represent multiple levels of hierarchy and branching relationships naturally -> Option D
Quick Check:
Hierarchical branching needs trees = A [OK]
Hint: Use trees for multi-level branching hierarchy [OK]
Common Mistakes:
Thinking arrays cannot store objects
Believing linked lists have size limits
Assuming trees always use less memory
4. What will be the output of the following Go code that builds a simple binary tree and prints the root's left child's value?
package main
import "fmt"
type Node struct {
value int
left *Node
right *Node
}
func main() {
root := &Node{value: 10}
root.left = &Node{value: 5}
root.right = &Node{value: 15}
fmt.Println(root.left.value)
}
medium
A. 10
B. 15
C. 5
D. Compilation error
Solution
Step 1: Analyze tree construction
Root node has value 10, left child value 5, right child value 15.
Step 2: Identify printed value
Code prints root.left.value, which is 5.
Final Answer:
5 -> Option C
Quick Check:
root.left.value = 5 [OK]
Hint: Print root.left.value to get left child's value [OK]
Common Mistakes:
Printing root.value instead of root.left.value
Confusing left and right child values
Assuming compilation error due to pointers
5. The following Go code attempts to create a binary tree node but has an error. What is the error?
type Node struct {
value int
left *Node
right *Node
}
func main() {
root := Node{value: 10}
root.left = Node{value: 5}
root.right = &Node{value: 15}
}
medium
A. No error, code compiles and runs fine
B. Cannot assign Node value to a pointer field without using &
C. Cannot declare root as value type, must be pointer
D. Missing semicolon after struct definition
Solution
Step 1: Check field types and assignments
left and right fields are pointers to Node (*Node).
Step 2: Identify incorrect assignment
root.left = Node{value: 5} assigns a value type to a pointer field without using & to get address.
Final Answer:
Cannot assign Node value to a pointer field without using & -> Option B
Quick Check:
Pointer fields need address (&) for assignment = D [OK]
Hint: Pointer fields require & when assigning values [OK]
Common Mistakes:
Ignoring pointer vs value type mismatch
Thinking root must be a pointer
Assuming missing semicolon causes error
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.