leetcode简单题25 N.112 路径总和 rust描述


 

use std::rc::Rc;
use std::cell::RefCell;

// Definition for a binary tree node.
#[derive(Debug, PartialEq, Eq)]
pub struct TreeNode {
    pub val: i32,
    pub left: Option<Rc<RefCell<TreeNode>>>,
    pub right: Option<Rc<RefCell<TreeNode>>>,
}
impl TreeNode {
    #[inline]
    pub fn new(val: i32) -> Self {
        TreeNode {
            val,
            left: None,
            right: None,
        }
    }
}
// 递归dfs
pub fn has_path_sum(root: Option<Rc<RefCell<TreeNode>>>, target_sum: i32) -> bool {
    fn dfs(node: &Option<Rc<RefCell<TreeNode>>>, target_sum: i32) -> bool {
        if let Some(node) = node {
            let node = node.borrow();
            let remaining_sum = target_sum - node.val;
            if node.left.is_none() && node.right.is_none() {
                return remaining_sum == 0;
            }
            dfs(&node.left, remaining_sum) || dfs(&node.right, remaining_sum)
        } else {
            false
        }
    }

    dfs(&root, target_sum)
}
// 迭代dfs
pub fn has_path_sum2(root: Option<Rc<RefCell<TreeNode>>>, target_sum: i32) -> bool {
    if root.is_none() {
        return false;
    }

    let mut stack = vec![(root.clone(), target_sum)];

    while let Some((node, remaining_sum)) = stack.pop() {
        if let Some(node) = node {
            let node = node.borrow();
            let new_sum = remaining_sum - node.val;

            if node.left.is_none() && node.right.is_none() && new_sum == 0 {
                return true;
            }

            if let Some(ref left) = node.left {
                stack.push((Some(Rc::clone(left)), new_sum));
            }

            if let Some(ref right) = node.right {
                stack.push((Some(Rc::clone(right)), new_sum));
            }
        }
    }

    false
}
use std::collections::VecDeque;
// bfs
pub fn has_path_sum3(root: Option<Rc<RefCell<TreeNode>>>, target_sum: i32) -> bool {
    if root.is_none() {
        return false;
    }

    let mut queue = VecDeque::new();
    queue.push_back((root.clone(), target_sum));

    while let Some((node, remaining_sum)) = queue.pop_front() {
        if let Some(node) = node {
            let node = node.borrow();
            let new_sum = remaining_sum - node.val;

            if node.left.is_none() && node.right.is_none() && new_sum == 0 {
                return true;
            }

            if let Some(ref left) = node.left {
                queue.push_back((Some(Rc::clone(left)), new_sum));
            }

            if let Some(ref right) = node.right {
                queue.push_back((Some(Rc::clone(right)), new_sum));
            }
        }
    }

    false
}
fn main() {}

相关推荐

  1. leetcode112.路径总和

    2024-07-16 07:28:10       31 阅读
  2. LeetCode112 路径总和

    2024-07-16 07:28:10       35 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-16 07:28:10       50 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-16 07:28:10       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-16 07:28:10       43 阅读
  4. Python语言-面向对象

    2024-07-16 07:28:10       54 阅读

热门阅读

  1. kubernetes1.24版本移除 Dockershim

    2024-07-16 07:28:10       20 阅读
  2. Redis 是什么

    2024-07-16 07:28:10       23 阅读
  3. BERT架构的深入解析

    2024-07-16 07:28:10       28 阅读
  4. PyCharm & 机器学习:打造高效数据可视化工作流

    2024-07-16 07:28:10       25 阅读
  5. 算法工程师热门面试问题一

    2024-07-16 07:28:10       16 阅读
  6. Android Studio Download Gradle 时慢问题解决

    2024-07-16 07:28:10       22 阅读
  7. 网络安全-网络安全及其防护措施3

    2024-07-16 07:28:10       27 阅读
  8. 安全加固:Eureka服务实例安全组配置全攻略

    2024-07-16 07:28:10       21 阅读
  9. Vue+Electron打包桌面应用(从零到一完整教程)

    2024-07-16 07:28:10       29 阅读
  10. Web3发展的基本要素

    2024-07-16 07:28:10       26 阅读