Bird
Raised Fist0
DSA Rustprogramming~20 mins

DP on Trees Maximum Path Sum in DSA Rust - Practice Problems & Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
DP on Trees Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output of Maximum Path Sum in a Simple Binary Tree
What is the output of the following Rust code that calculates the maximum path sum in a binary tree?
DSA Rust
use std::rc::Rc;
use std::cell::RefCell;

#[derive(Debug)]
struct TreeNode {
    val: i32,
    left: Option<Rc<RefCell<TreeNode>>>,
    right: Option<Rc<RefCell<TreeNode>>>,
}

impl TreeNode {
    fn new(val: i32) -> Rc<RefCell<TreeNode>> {
        Rc::new(RefCell::new(TreeNode { val, left: None, right: None }))
    }
}

fn max_path_sum(root: Option<Rc<RefCell<TreeNode>>>) -> i32 {
    fn helper(node: Option<Rc<RefCell<TreeNode>>>, max_sum: &mut i32) -> i32 {
        if let Some(n) = node {
            let left = helper(n.borrow().left.clone(), max_sum).max(0);
            let right = helper(n.borrow().right.clone(), max_sum).max(0);
            let current = n.borrow().val + left + right;
            *max_sum = (*max_sum).max(current);
            n.borrow().val + left.max(right)
        } else {
            0
        }
    }
    let mut max_sum = i32::MIN;
    helper(root, &mut max_sum);
    max_sum
}

fn main() {
    let root = TreeNode::new(1);
    root.borrow_mut().left = Some(TreeNode::new(2));
    root.borrow_mut().right = Some(TreeNode::new(3));
    println!("{}", max_path_sum(Some(root)));
}
A5
B6
C3
D1
Attempts:
2 left
💡 Hint
Consider the path that includes both left and right children plus the root.
❓ Predict Output
intermediate
2:00remaining
Maximum Path Sum with Negative Values
What is the output of this Rust code calculating maximum path sum in a tree with negative values?
DSA Rust
use std::rc::Rc;
use std::cell::RefCell;

#[derive(Debug)]
struct TreeNode {
    val: i32,
    left: Option<Rc<RefCell<TreeNode>>>,
    right: Option<Rc<RefCell<TreeNode>>>,
}

impl TreeNode {
    fn new(val: i32) -> Rc<RefCell<TreeNode>> {
        Rc::new(RefCell::new(TreeNode { val, left: None, right: None }))
    }
}

fn max_path_sum(root: Option<Rc<RefCell<TreeNode>>>) -> i32 {
    fn helper(node: Option<Rc<RefCell<TreeNode>>>, max_sum: &mut i32) -> i32 {
        if let Some(n) = node {
            let left = helper(n.borrow().left.clone(), max_sum).max(0);
            let right = helper(n.borrow().right.clone(), max_sum).max(0);
            let current = n.borrow().val + left + right;
            *max_sum = (*max_sum).max(current);
            n.borrow().val + left.max(right)
        } else {
            0
        }
    }
    let mut max_sum = i32::MIN;
    helper(root, &mut max_sum);
    max_sum
}

fn main() {
    let root = TreeNode::new(-10);
    root.borrow_mut().left = Some(TreeNode::new(9));
    root.borrow_mut().right = Some(TreeNode::new(20));
    root.borrow_mut().right.as_ref().unwrap().borrow_mut().left = Some(TreeNode::new(15));
    root.borrow_mut().right.as_ref().unwrap().borrow_mut().right = Some(TreeNode::new(7));
    println!("{}", max_path_sum(Some(root)));
}
A42
B27
C35
D-10
Attempts:
2 left
💡 Hint
The maximum path includes nodes 15, 20, and 7.
🔧 Debug
advanced
2:00remaining
Identify the Bug in Maximum Path Sum Calculation
What error will this Rust code produce when calculating maximum path sum, and why?
DSA Rust
use std::rc::Rc;
use std::cell::RefCell;

#[derive(Debug)]
struct TreeNode {
    val: i32,
    left: Option<Rc<RefCell<TreeNode>>>,
    right: Option<Rc<RefCell<TreeNode>>>,
}

impl TreeNode {
    fn new(val: i32) -> Rc<RefCell<TreeNode>> {
        Rc::new(RefCell::new(TreeNode { val, left: None, right: None }))
    }
}

fn max_path_sum(root: Option<Rc<RefCell<TreeNode>>>) -> i32 {
    fn helper(node: Option<Rc<RefCell<TreeNode>>>, max_sum: &mut i32) -> i32 {
        if let Some(n) = node {
            let left = helper(n.borrow().left.clone(), max_sum);
            let right = helper(n.borrow().right.clone(), max_sum);
            let current = n.borrow().val + left + right;
            *max_sum = (*max_sum).max(current);
            n.borrow().val + left.max(right)
        } else {
            0
        }
    }
    let mut max_sum = i32::MIN;
    helper(root, &mut max_sum);
    max_sum
}

fn main() {
    let root = TreeNode::new(-1);
    root.borrow_mut().left = Some(TreeNode::new(-3));
    println!("{}", max_path_sum(Some(root)));
}
AReturns -3
BReturns 0
CReturns -1
DStack overflow error
Attempts:
2 left
💡 Hint
Check how negative values are handled in the recursion.
🚀 Application
advanced
2:00remaining
Maximum Path Sum in a Tree with Multiple Branches
Given a tree where nodes can have multiple children (not just binary), which approach correctly computes the maximum path sum?
AUse BFS to find the longest path and sum node values along it.
BSum all children values and add node value to get max path sum at each node.
COnly consider the maximum child path sum plus node value, ignore second max child path sum.
DUse DFS to find max single path from each child, keep top two max sums, update global max with node val plus these two sums.
Attempts:
2 left
💡 Hint
Think about how to combine two best child paths through the current node.
🧠 Conceptual
expert
2:00remaining
Why Use max(0, child_sum) in Maximum Path Sum Calculation?
In the maximum path sum algorithm on trees, why do we use max(0, child_sum) when calculating the contribution of child paths?
ATo convert all negative values to zero for easier addition.
BTo ensure the path always includes at least one child node.
CTo ignore negative child path sums that would reduce the overall path sum.
DTo guarantee the path sum is always positive.
Attempts:
2 left
💡 Hint
Consider what happens if a child path sum is negative.

Practice

(1/5)
1. What does the "maximum path sum" in a tree represent in the context of DP on Trees Maximum Path Sum?
easy
A. The largest sum of node values along any path between two nodes in the tree
B. The sum of all node values in the tree
C. The maximum value of a single node in the tree
D. The number of nodes in the longest path of the tree

Solution

  1. Step 1: Understand the definition of path sum

    The path sum is the total of node values along a path connecting two nodes in the tree.
  2. Step 2: Identify the maximum path sum meaning

    The maximum path sum is the largest such sum among all possible paths in the tree.
  3. Final Answer:

    The largest sum of node values along any path between two nodes in the tree -> Option A
  4. Quick Check:

    Maximum path sum = largest node value sum on any path [OK]
Hint: Maximum path sum is about sums on paths, not single nodes [OK]
Common Mistakes:
  • Confusing maximum path sum with sum of all nodes
  • Thinking it is just the max node value
  • Counting number of nodes instead of sum
2. Which of the following Rust function signatures is correct for a recursive function that calculates the maximum path sum in a binary tree node defined as struct TreeNode { val: i32, left: Option, right: Option }?
easy
A. fn max_path_sum(node: Box<TreeNode>) -> Option<i32>
B. fn max_path_sum(node: TreeNode) -> i32
C. fn max_path_sum(node: &Option) -> i32
D. fn max_path_sum(node: &TreeNode) -> Option<i32>

Solution

  1. Step 1: Understand ownership and borrowing in Rust

    Recursive tree functions usually borrow nodes to avoid ownership transfer and cloning.
  2. Step 2: Match function signature to tree node type

    The tree node is wrapped in Option, so borrowing it as &Option is correct for recursion.
  3. Final Answer:

    fn max_path_sum(node: &Option) -> i32 -> Option C
  4. Quick Check:

    Borrow Option and return i32 [OK]
Hint: Use &Option to borrow nodes recursively [OK]
Common Mistakes:
  • Taking ownership of node causing move errors
  • Returning Option<i32> unnecessarily
  • Using &TreeNode instead of &Option
3. Given the following Rust code snippet for maximum path sum in a binary tree, what is the output printed?
struct TreeNode {
    val: i32,
    left: Option,
    right: Option,
}

fn max_gain(node: &Option, max_sum: &mut i32) -> i32 {
    if let Some(n) = node {
        let left_gain = max_gain(&n.left, max_sum).max(0);
        let right_gain = max_gain(&n.right, max_sum).max(0);
        let price_newpath = n.val + left_gain + right_gain;
        *max_sum = (*max_sum).max(price_newpath);
        n.val + left_gain.max(right_gain)
    } else {
        0
    }
}

fn max_path_sum(root: &Option) -> i32 {
    let mut max_sum = i32::MIN;
    max_gain(root, &mut max_sum);
    max_sum
}

fn main() {
    let root = Some(Box::new(TreeNode {
        val: -10,
        left: Some(Box::new(TreeNode {
            val: 9,
            left: None,
            right: None,
        })),
        right: Some(Box::new(TreeNode {
            val: 20,
            left: Some(Box::new(TreeNode {
                val: 15,
                left: None,
                right: None,
            })),
            right: Some(Box::new(TreeNode {
                val: 7,
                left: None,
                right: None,
            })),
        })),
    }));
    println!("{}", max_path_sum(&root));
}
medium
A. 42
B. 35
C. 27
D. 20

Solution

  1. Step 1: Calculate max path sums for each subtree

    Calculate max gains: - Left subtree (9): max gain = 9 - Right subtree: - Left child (15): max gain = 15 - Right child (7): max gain = 7 - Node 20: max gain = 20 + max(15,7) = 35 - Max path through 20: 20 + 15 + 7 = 42
  2. Step 2: Calculate max path including root (-10)

    Root max gain = -10 + max(9, 35) = 25 Max path sum is max of: - Left subtree max: 9 - Right subtree max: 42 - Root path: 25 So max path sum = 42
  3. Final Answer:

    42 -> Option A
  4. Quick Check:

    Max path sum = 42 [OK]
Hint: Add node value plus max left/right gains, track max path [OK]
Common Mistakes:
  • Ignoring negative values and not using max(0, gain)
  • Adding gains incorrectly for path through root
  • Confusing max gain with max path sum
4. The following Rust function attempts to compute the maximum path sum in a binary tree but contains a bug. What is the bug?
fn max_gain(node: &Option, max_sum: &mut i32) -> i32 {
    if let Some(n) = node {
        let left_gain = max_gain(&n.left, max_sum);
        let right_gain = max_gain(&n.right, max_sum);
        let price_newpath = n.val + left_gain + right_gain;
        *max_sum = (*max_sum).max(price_newpath);
        n.val + left_gain.max(right_gain)
    } else {
        0
    }
}
medium
A. It incorrectly updates max_sum inside recursion
B. It does not handle empty tree nodes
C. It returns the sum of left and right gains instead of max
D. It does not ignore negative gains by using max(0, gain)

Solution

  1. Step 1: Analyze gain calculation for left and right subtrees

    The function uses left_gain and right_gain directly without ignoring negative values, which can reduce the path sum.
  2. Step 2: Identify the fix for negative gains

    Correct approach is to use max_gain = max(0, recursive_gain) to ignore negative paths that reduce sum.
  3. Final Answer:

    It does not ignore negative gains by using max(0, gain) -> Option D
  4. Quick Check:

    Use max(0, gain) to avoid negative path sums [OK]
Hint: Always ignore negative gains with max(0, gain) [OK]
Common Mistakes:
  • Forgetting to ignore negative subtree sums
  • Updating max_sum incorrectly
  • Returning wrong values from recursion
5. You want to modify the maximum path sum algorithm to find the maximum path sum that must include the root node in a binary tree. Which change should you make to the existing DP on Trees Maximum Path Sum approach?
hard
A. Use a global variable to store max sum and update it only when the path includes root and both children
B. Return the sum of the root value plus the maximum gain from either left or right subtree only, and track max sum accordingly
C. Calculate max path sum as usual but ignore paths that do not include the root node
D. Traverse the tree twice: once for max path sum and once for root-included path sum, then compare

Solution

  1. Step 1: Understand the root-included path sum requirement

    The path must include the root node, so the path is root plus one subtree path (left or right), not both sides.
  2. Step 2: Modify the gain calculation accordingly

    Return root.val + max(left_gain, right_gain) ignoring negative gains, and track max sum as this value.
  3. Final Answer:

    Return the sum of the root value plus the maximum gain from either left or right subtree only, and track max sum accordingly -> Option B
  4. Quick Check:

    Root-included max path = root + max(left, right) [OK]
Hint: Include root plus max one subtree gain only [OK]
Common Mistakes:
  • Adding both left and right gains when root must be included
  • Ignoring negative gains
  • Trying to filter paths after calculation
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard