提交 23cadf85 编写于 作者: 梦境迷离's avatar 梦境迷离

rust leetcode 687

fix borrow
上级 0ce22f4b
......@@ -12,15 +12,20 @@ Leetcode Rust 实现
* [面试题 55 - I 二叉树的深度](src/interview_55_1.rs)
* [面试题 04.02 最小高度树](src/interview_04_02.rs)
* [938 二叉搜索树的范围和](src/leetcode_938.rs)
* [617 合并二叉树](src/leetcode_617.rs)
* [面试题 54 二叉搜索树的第k大节点](src/interview_54.rs)
* [面试题 32 - II. 从上到下打印二叉树 II](src/interview_32_2.rs)
* [100 相同的树](src/leetcode_100.rs)
* [101 对称二叉树](src/leetcode_101.rs)
* [107 二叉树的层次遍历 II](src/leetcode_107.rs)
* [110 平衡二叉树](src/leetcode_110.rs)
* [111 二叉树的最小深度](src/leetcode_111.rs)
* [112 路径总和](src/leetcode_112.rs)
* [687 最长同值路径](src/leetcode_687.rs)
### unsafe写法
* [617 合并二叉树](src/leetcode_617.rs)
* [100 相同的树](src/leetcode_100.rs)
## 链表&栈&队列
......
......@@ -20,9 +20,6 @@ impl Solution {
cur = n.try_borrow().unwrap().right.clone();
}
}
for e in ret.iter() {
println!("{}", e);
}
ret[(ret.len() - k as usize)]
}
}
......@@ -16,17 +16,17 @@ impl Solution {
match node {
Some(n) => {
return match (
n.as_ref().borrow().borrow().left.is_some(),
n.as_ref().borrow().borrow().right.is_some(),
n.as_ref().borrow().left.is_some(),
n.as_ref().borrow().right.is_some(),
) {
(true, true) => {
min(
min_depth_(&n.as_ref().borrow().borrow().left),
min_depth_(&n.as_ref().borrow().borrow().right),
min_depth_(&n.as_ref().borrow().left),
min_depth_(&n.as_ref().borrow().right),
) + 1
}
(false, true) => min_depth_(&n.as_ref().borrow().borrow().right) + 1,
(true, false) => min_depth_(&n.as_ref().borrow().borrow().left) + 1,
(false, true) => min_depth_(&n.as_ref().borrow().right) + 1,
(true, false) => min_depth_(&n.as_ref().borrow().left) + 1,
(false, false) => 1,
_ => 0,
};
......
......@@ -14,17 +14,17 @@ impl Solution {
match node {
Some(n) => {
match (
n.as_ref().borrow().borrow().left.is_none(),
n.as_ref().borrow().borrow().right.is_none(),
n.as_ref().borrow().left.is_none(),
n.as_ref().borrow().right.is_none(),
) {
(true, true) => origin_sum - n.as_ref().borrow().borrow().val == 0,
(true, true) => origin_sum - n.as_ref().borrow().val == 0,
(_, _) => {
helper(
&n.as_ref().borrow().borrow().left,
origin_sum - n.as_ref().borrow().borrow().val,
&n.as_ref().borrow().left,
origin_sum - n.as_ref().borrow().val,
) || helper(
&n.as_ref().borrow().borrow().right,
origin_sum - n.as_ref().borrow().borrow().val,
&n.as_ref().borrow().right,
origin_sum - n.as_ref().borrow().val,
)
}
}
......
use std::borrow::Borrow;
use std::cell::RefCell;
use std::cmp::max;
use std::rc::Rc;
use crate::pre_structs::{Solution, TreeNode};
/// 687. 最长同值路径
/// 给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。
impl Solution {
//24 ms,77.78%
//3 MB,100.00%
pub fn longest_univalue_path(root: Option<Rc<RefCell<TreeNode>>>) -> i32 {
fn helper(root: &Option<Rc<RefCell<TreeNode>>>, res: &mut i32) -> i32 {
if let Some(root) = root {
let mut left = helper(&root.as_ref().borrow().left, res);
let mut right = helper(&root.as_ref().borrow().right, res);
if root.as_ref().borrow().left.as_ref().is_some()
&& root
.as_ref()
.borrow()
.left
.as_ref()
.unwrap()
.as_ref()
.borrow()
.val
== root.as_ref().borrow().val
{
left += 1
} else {
left = 0;
}
if root.as_ref().borrow().right.as_ref().is_some()
&& root
.as_ref()
.borrow()
.right
.as_ref()
.unwrap()
.as_ref()
.borrow()
.val
== root.as_ref().borrow().val
{
right += 1
} else {
right = 0;
}
*res = (*res).max(left + right);
left.max(right)
} else {
0
}
}
let mut res = 0i32;
helper(&root, &mut res);
res
}
}
#[cfg(test)]
mod test {
use std::cell::RefCell;
use std::rc::Rc;
use crate::pre_structs::{get_test_tree_4, Solution, TreeNode};
#[test]
fn longest_univalue_path() {
let ret = Solution::longest_univalue_path(get_test_tree_4());
assert!(ret == 2);
}
}
......@@ -67,6 +67,7 @@ pub mod leetcode_66;
pub mod leetcode_665;
pub mod leetcode_67;
pub mod leetcode_686;
pub mod leetcode_687;
pub mod leetcode_709;
pub mod leetcode_728;
pub mod leetcode_804;
......
......@@ -100,3 +100,28 @@ pub fn get_test_tree_2() -> Option<Rc<RefCell<TreeNode>>> {
root1
}
pub fn get_test_tree_4() -> Option<Rc<RefCell<TreeNode>>> {
let e3 = Some(Rc::new(RefCell::new(TreeNode {
val: 2,
left: None,
right: None,
})));
let e2 = Some(Rc::new(RefCell::new(TreeNode {
val: 2,
left: None,
right: e3,
})));
let e1 = Some(Rc::new(RefCell::new(TreeNode {
val: 2,
left: None,
right: e2,
})));
let root1 = Some(Rc::new(RefCell::new(TreeNode {
val: 1,
left: None,
right: e1,
})));
root1
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册