What if you could find the biggest number instantly without looking at every single one?
Why BST Find Maximum Element in DSA Rust?
Imagine you have a messy pile of books with different heights, and you want to find the tallest book. If you check each book one by one, it takes a lot of time and effort.
Manually checking each book is slow and easy to make mistakes, especially if the pile is huge. You might lose track or miss the tallest book.
A Binary Search Tree (BST) organizes books so that the tallest book is always on the right side. To find the tallest book, you just keep going right until you can't go further. This is fast and simple.
let mut max_height = books[0].height; for book in books.iter() { if book.height > max_height { max_height = book.height; } }
fn find_max(node: &Option<Box<Node>>) -> Option<i32> {
match node {
None => None,
Some(n) => {
if n.right.is_none() {
Some(n.value)
} else {
find_max(&n.right)
}
}
}
}This lets you quickly find the largest value in a sorted structure without checking every element.
Finding the highest score in a game leaderboard stored as a BST, so you instantly know the top player.
Manual search is slow and error-prone.
BST structure keeps largest elements on the right.
Finding max in BST is fast by going right until no more right child.
Practice
Solution
Step 1: Understand BST property
In a BST, left child nodes are smaller and right child nodes are larger than the parent node.Step 2: Locate maximum element
The maximum element is the rightmost node because it has no larger right child.Final Answer:
At the rightmost node -> Option CQuick Check:
Maximum = rightmost node [OK]
- Confusing maximum with root node
- Thinking maximum is at leftmost node
- Assuming maximum can be any leaf
Solution
Step 1: Analyze code logic
fn find_max(node: &Option) -> i32 { let mut current = node; while let Some(ref n) = current { if n.right.is_none() { return n.value; } current = &n.right; } unreachable!() } uses a loop to traverse right children until none remain, returning the rightmost node's value.Step 2: Check other options
fn find_max(node: &Option) -> i32 { node.unwrap().value } returns root value only, C returns left child value, D returns constant 0, all incorrect.Final Answer:
Iterative right traversal to rightmost node -> Option AQuick Check:
Traverse right until None = max value [OK]
- Returning root value without traversal
- Accessing left child instead of right
- Returning a fixed value ignoring tree
struct Node { value: i32, left: Option, right: Option }
fn find_max(node: &Option) -> i32 {
let mut current = node;
while let Some(ref n) = current {
if n.right.is_none() {
return n.value;
}
current = &n.right;
}
unreachable!()
}
fn main() {
let tree = Some(Box::new(Node {
value: 10,
left: Some(Box::new(Node { value: 5, left: None, right: None })),
right: Some(Box::new(Node {
value: 15,
left: None,
right: Some(Box::new(Node { value: 20, left: None, right: None }))
}))
}));
println!("{}", find_max(&tree));
}Solution
Step 1: Trace the tree structure
Root is 10, right child 15, right child's right child 20 (rightmost node).Step 2: Follow find_max logic
Function moves right until no right child: stops at node with value 20.Final Answer:
20 -> Option BQuick Check:
Rightmost node value = 20 [OK]
- Returning root value instead of rightmost
- Confusing left and right children
- Not following loop to last right node
fn find_max(node: &Option) -> i32 {
if node.is_none() {
return 0;
}
let mut current = node;
while current.is_some() {
if current.as_ref().unwrap().right.is_none() {
return current.as_ref().unwrap().value;
}
current = ยคt.as_ref().unwrap().left;
}
0
}Solution
Step 1: Analyze traversal direction
Function moves to left child in loop, but max is in right subtree.Step 2: Identify correct traversal
To find max, must traverse right child until None, not left.Final Answer:
It traverses left child instead of right child -> Option DQuick Check:
Max = rightmost node, not left [OK]
- Going left instead of right
- Returning 0 silently for empty tree
- Unwrapping without safe checks
Solution
Step 1: Understand duplicates in BST
In a BST (allowing duplicates typically on right), the maximum value(s) propagate to the rightmost node.Step 2: Correct approach
Traverse right until None; this reaches the rightmost node holding the maximum value, even with duplicates.Final Answer:
Traverse right until None and return the last node's value -> Option AQuick Check:
Rightmost = max even with duplicates [OK]
- Using recursion on left subtree
- Traversing both subtrees unnecessarily
- Returning root value with duplicates
Ready to prove it?
Pass the test and this pattern moves unknown
