首页 > 试题广场 >

左叶子之和

[编程题]左叶子之和
  • 热度指数:3037 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
计算给定二叉树的左叶子之和。

树上叶子节点指没有后继节点的节点,左叶子指连向父节点的左侧的叶子节点。

样例 2 解释:

叶子节点有 4 , 5 ,3,左叶子只有 4 ,所以答案返回 4

样例 3 解释

叶子节点有 4 , 5 ,6,左叶子有 4 , 6,所以答案返回 10

数据范围:树上节点的数量满足 ,节点上的值满足
示例1

输入

{1,2}

输出

2
示例2

输入

{1,2,3,4,5}

输出

4
示例3

输入

{1,2,3,4,5,6}

输出

10

说明:本题目包含复杂数据结构TreeNode,点此查看相关信息
/**
 * #[derive(PartialEq, Eq, Debug, Clone)]
 * pub struct TreeNode {
 *     pub val: i32,
 *     pub left: Option<Box<TreeNode>>,
 *     pub right: Option<Box<TreeNode>>,
 * }
 *
 * impl TreeNode {
 *     #[inline]
 *     fn new(val: i32) -> Self {
 *         TreeNode {
 *             val: val,
 *             left: None,
 *             right: None,
 *         }
 *     }
 * }
 */
struct Solution{

}

impl Solution {
    fn new() -> Self {
        Solution{}
    }

    /**
    * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    *
    * 
        * @param root TreeNode类 
        * @return int整型
    */
    pub fn sumOfLeftLeaves(&self, root: Option<Box<TreeNode>>) -> i32 {
        // write code here
        if root.is_none() {0} else {
            self.left_leave_sum(&root.as_ref().unwrap().left, true) + 
            self.left_leave_sum(&root.as_ref().unwrap().right, false)
        }
    }

    fn left_leave_sum(&self, node: &Option<Box<TreeNode>>, from_left_edge: bool) -> i32 {
        if node.is_none() {return 0}
        if node.as_ref().unwrap().left.is_none() && node.as_ref().unwrap().right.is_none() && from_left_edge {
            node.as_ref().unwrap().val
        } else {
            self.left_leave_sum(&node.as_ref().unwrap().left, true) + 
            self.left_leave_sum(&node.as_ref().unwrap().right, false)
        }
    }
}

发表于 2023-08-31 22:03:26 回复(0)