129. 求根到叶子节点数字之和

每天一道Rust-LeetCode(2019-09-13)

坚持每天一道题,刷题学习Rust.

题目描述

给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。

例如,从根到叶子节点路径 1->2->3 代表数字 123。

计算从根到叶子节点生成的所有数字之和。

说明: 叶子节点是指没有子节点的节点。

示例 1:

输入: [1,2,3]

1

/
2 3
输出: 25
解释:
从根到叶子节点路径 1->2 代表数字 12.
从根到叶子节点路径 1->3 代表数字 13.
因此,数字总和 = 12 + 13 = 25.
示例 2:

输入: [4,9,0,5,1]
    4
   / \
  9   0
/ \
5   1
输出: 1026
解释:
从根到叶子节点路径 4->9->5 代表数字 495.
从根到叶子节点路径 4->9->1 代表数字 491.
从根到叶子节点路径 4->0 代表数字 40.
因此,数字总和 = 495 + 491 + 40 = 1026.

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sum-root-to-leaf-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

非常简单,
如果要改用迭代,也很简单,就是使用vec先保存节点,再去遍历

解题过程

use crate::share::TreeNode;
use std::cell::RefCell;
use std::rc::Rc;
struct Solution {}
impl Solution {
    pub fn sum_numbers(root: Option<Rc<RefCell<TreeNode>>>) -> i32 {
        let mut sum = 0;
        Solution::internal(root, 0, &mut sum);
        return sum;
    }
    fn internal(root: Option<Rc<RefCell<TreeNode>>>, mut path_sum: i32, sum: &mut i32) {
        if let Some(r) = root {
            path_sum = path_sum * 10 + r.borrow().val;
            if r.borrow().left.is_none() && r.borrow().right.is_none() {
                *sum += path_sum; //找到了一条路径
            }
            //简单起见不做区分,尝试左右子节点
            Solution::internal(r.borrow().left.clone(), path_sum, sum);
            Solution::internal(r.borrow().right.clone(), path_sum, sum);
        }
    }
}

#[cfg(test)]
mod test {
    #[warn(unused_imports)]
    use super::*;
    use crate::share::build_tree;
    use crate::share::NULL;
    #[test]
    fn test_generate() {
        let t = build_tree(&vec![4, 9, 0, 5, 1]);
        assert_eq!(1026, Solution::sum_numbers(t));
        let t = build_tree(&vec![1, 2, 3]);
        assert_eq!(25, Solution::sum_numbers(t));
    }
}

一点感悟

其他

欢迎关注我的github,本项目文章所有代码都可以找到.