0
0
DSA Goprogramming~20 mins

Tree Traversal Level Order BFS in DSA Go - Practice Problems & Challenges

Choose your learning style9 modes available
Challenge - 5 Problems
🎖️
Level Order BFS Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
Predict Output
intermediate
2:00remaining
Output of Level Order Traversal on a Simple Tree
What is the output of the following Go code performing level order traversal (BFS) on a binary tree?
DSA Go
package main

import "fmt"

type TreeNode struct {
    Val   int
    Left  *TreeNode
    Right *TreeNode
}

func levelOrder(root *TreeNode) []int {
    if root == nil {
        return []int{}
    }
    queue := []*TreeNode{root}
    result := []int{}
    for len(queue) > 0 {
        node := queue[0]
        queue = queue[1:]
        result = append(result, node.Val)
        if node.Left != nil {
            queue = append(queue, node.Left)
        }
        if node.Right != nil {
            queue = append(queue, node.Right)
        }
    }
    return result
}

func main() {
    root := &TreeNode{Val: 1}
    root.Left = &TreeNode{Val: 2}
    root.Right = &TreeNode{Val: 3}
    root.Left.Left = &TreeNode{Val: 4}
    root.Left.Right = &TreeNode{Val: 5}
    fmt.Println(levelOrder(root))
}
A[1 2 3 4 5]
B[1 3 2 4 5]
C[4 5 2 3 1]
D[1 2 4 5 3]
Attempts:
2 left
💡 Hint
Remember, level order traversal visits nodes level by level from left to right.
🧠 Conceptual
intermediate
1:30remaining
Understanding Queue Usage in Level Order Traversal
Why is a queue used in level order traversal (BFS) of a binary tree instead of a stack?
ABecause a queue uses less memory than a stack.
BBecause a stack processes nodes in FIFO order, which is needed for BFS.
CBecause a queue processes nodes in FIFO order, preserving the level order sequence.
DBecause a stack cannot store tree nodes.
Attempts:
2 left
💡 Hint
Think about the order nodes are visited in BFS.
🔧 Debug
advanced
2:00remaining
Identify the Bug in Level Order Traversal Code
What error will the following Go code produce when performing level order traversal?
DSA Go
func levelOrder(root *TreeNode) []int {
    var queue []*TreeNode
    var result []int
    queue = append(queue, root)
    for len(queue) > 0 {
        node := queue[0]
        queue = queue[1:]
        result = append(result, node.Val)
        if node.Left != nil {
            queue = append(queue, node.Left)
        }
        if node.Right != nil {
            queue = append(queue, node.Right)
        }
    }
    return result
}
ANo error, outputs correct traversal
BSyntaxError: missing return statement
CIndexError: slice index out of range
Druntime error: invalid memory address or nil pointer dereference
Attempts:
2 left
💡 Hint
What happens if root is nil?
Predict Output
advanced
2:00remaining
Output of Level Order Traversal with Unbalanced Tree
What is the output of the following Go code performing level order traversal on an unbalanced binary tree?
DSA Go
package main

import "fmt"

type TreeNode struct {
    Val   int
    Left  *TreeNode
    Right *TreeNode
}

func levelOrder(root *TreeNode) []int {
    if root == nil {
        return []int{}
    }
    queue := []*TreeNode{root}
    result := []int{}
    for len(queue) > 0 {
        node := queue[0]
        queue = queue[1:]
        result = append(result, node.Val)
        if node.Left != nil {
            queue = append(queue, node.Left)
        }
        if node.Right != nil {
            queue = append(queue, node.Right)
        }
    }
    return result
}

func main() {
    root := &TreeNode{Val: 10}
    root.Right = &TreeNode{Val: 20}
    root.Right.Right = &TreeNode{Val: 30}
    fmt.Println(levelOrder(root))
}
A[10 30 20]
B[10 20 30]
C[30 20 10]
D[10 20]
Attempts:
2 left
💡 Hint
Level order visits nodes level by level, left to right.
🚀 Application
expert
3:00remaining
Number of Nodes at Each Level Using Level Order Traversal
Given a binary tree, which code snippet correctly returns a slice of integers representing the count of nodes at each level using level order traversal in Go?
A
func countNodesPerLevel(root *TreeNode) []int {
    if root == nil {
        return []int{}
    }
    queue := []*TreeNode{root}
    counts := []int{}
    for len(queue) > 0 {
        levelSize := len(queue)
        counts = append(counts, levelSize)
        for i := 0; i < levelSize; i++ {
            node := queue[0]
            queue = queue[1:]
            if node.Left != nil {
                queue = append(queue, node.Left)
            }
            if node.Right != nil {
                queue = append(queue, node.Right)
            }
        }
    }
    return counts
}
B
func countNodesPerLevel(root *TreeNode) []int {
    if root == nil {
        return []int{}
    }
    queue := []*TreeNode{root}
    counts := []int{}
    for len(queue) > 0 {
        levelSize := len(queue)
        counts = append(counts, levelSize)
        for i := 0; i <= levelSize; i++ {
            node := queue[0]
            queue = queue[1:]
            if node.Left != nil {
                queue = append(queue, node.Left)
            }
            if node.Right != nil {
                queue = append(queue, node.Right)
            }
        }
    }
    return counts
}
C
func countNodesPerLevel(root *TreeNode) []int {
    if root == nil {
        return []int{}
    }
    queue := []*TreeNode{root}
    counts := []int{}
    for len(queue) > 0 {
        levelSize := len(queue)
        for i := 0; i < levelSize; i++ {
            node := queue[0]
            queue = queue[1:]
            if node.Left != nil {
                queue = append(queue, node.Left)
            }
            if node.Right != nil {
                queue = append(queue, node.Right)
            }
        }
        counts = append(counts, levelSize)
    }
    return counts
}
D
func countNodesPerLevel(root *TreeNode) []int {
    if root == nil {
        return []int{}
    }
    queue := []*TreeNode{root}
    counts := []int{}
    for len(queue) > 0 {
        counts = append(counts, len(queue))
        node := queue[0]
        queue = queue[1:]
        if node.Left != nil {
            queue = append(queue, node.Left)
        }
        if node.Right != nil {
            queue = append(queue, node.Right)
        }
    }
    return counts
}
Attempts:
2 left
💡 Hint
Count nodes before processing each level, and process exactly that many nodes per level.