leetcode/src/problem/p310_minimum_height_trees.rs
2024-10-24 09:08:13 +08:00

86 lines
2.0 KiB
Rust

/**
* [310] Minimum Height Trees
*/
pub struct Solution {}
// submission codes start here
use std::collections::VecDeque;
impl Solution {
pub fn find_min_height_trees(n: i32, edges: Vec<Vec<i32>>) -> Vec<i32> {
let n = n as usize;
let mut graph = vec![vec![]; n];
for edge in &edges {
let x = edge[0] as usize;
let y = edge[1] as usize;
graph[x].push(y);
graph[y].push(x);
}
let mut parents = vec![usize::MAX; n];
let x = Solution::find_longest_node(0, &mut parents, &graph);
let mut y = Solution::find_longest_node(x, &mut parents, &graph);
let mut path = Vec::new();
parents[x] = usize::MAX;
parents = dbg!(parents);
while y != usize::MAX {
path.push(y);
y = parents[y];
}
let length = path.len();
return if length % 2 != 0 {
vec![path[length / 2] as i32]
} else {
vec![path[length / 2 - 1] as i32, path[length / 2] as i32]
};
}
fn find_longest_node(node: usize, parents: &mut Vec<usize>, graph: &Vec<Vec<usize>>) -> usize {
let n = graph.len();
let mut queue = VecDeque::with_capacity(n);
let mut visited = vec![false; n];
queue.push_back(node);
visited[node] = true;
let mut result = usize::MAX;
while !queue.is_empty() {
let now = queue.pop_front().unwrap();
dbg!(now);
result = now;
for next in &graph[now] {
let next = *next;
if !visited[next] {
visited[next] = true;
parents[next] = now;
queue.push_back(next);
}
}
}
result
}
}
// submission codes end
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_310() {
assert_eq!(
vec![1],
Solution::find_min_height_trees(4, vec![vec![1, 0], vec![1, 2], vec![1, 3]])
);
}
}