From 5e0ea0deaf73b47e24b9ca42cdd792e81370e155 Mon Sep 17 00:00:00 2001 From: jackfiled Date: Fri, 9 Feb 2024 10:31:26 +0800 Subject: [PATCH] 20240209 Finished --- src/problem/mod.rs | 3 +- ...lowest_common_ancestor_of_a_binary_tree.rs | 69 +++++++++++++++++++ 2 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 src/problem/p236_lowest_common_ancestor_of_a_binary_tree.rs diff --git a/src/problem/mod.rs b/src/problem/mod.rs index 39d2f8b..6821846 100644 --- a/src/problem/mod.rs +++ b/src/problem/mod.rs @@ -41,4 +41,5 @@ mod p292_nim_game; mod p1696_jump_game_vi; mod lcp30_magic_tower; mod p2641_cousins_in_binary_tree_ii; -mod p993_cousins_in_binary_tree; \ No newline at end of file +mod p993_cousins_in_binary_tree; +mod p236_lowest_common_ancestor_of_a_binary_tree; \ No newline at end of file diff --git a/src/problem/p236_lowest_common_ancestor_of_a_binary_tree.rs b/src/problem/p236_lowest_common_ancestor_of_a_binary_tree.rs new file mode 100644 index 0000000..a161d5d --- /dev/null +++ b/src/problem/p236_lowest_common_ancestor_of_a_binary_tree.rs @@ -0,0 +1,69 @@ +/** + * [236] Lowest Common Ancestor of a Binary Tree + */ +pub struct Solution {} + +use crate::util::tree::{TreeNode, to_tree}; + +// submission codes start here + +// Definition for a binary tree node. +// #[derive(Debug, PartialEq, Eq)] +// pub struct TreeNode { +// pub val: i32, +// pub left: Option>>, +// pub right: Option>>, +// } +// +// impl TreeNode { +// #[inline] +// pub fn new(val: i32) -> Self { +// TreeNode { +// val, +// left: None, +// right: None +// } +// } +// } +use std::rc::Rc; +use std::cell::RefCell; +impl Solution { + pub fn lowest_common_ancestor(root: Option>>, p: Option>>, q: Option>>) -> Option>> { + if root.is_none() || root == p || root == q { + return root; + } + + let left = Solution::lowest_common_ancestor( + root.as_ref().unwrap().borrow_mut().left.take(), + p.clone(), + q.clone() + ); + + let right = Solution::lowest_common_ancestor( + root.as_ref().unwrap().borrow_mut().right.take(), + p.clone(), + q.clone() + ); + + if left.is_some() && right.is_some() { + return root; + } + + if left.is_some() { + left + } else { + right + } + } +} + +// submission codes end + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_236() { + } +}