172.二叉树:左叶子之和(力扣)

2024-06-09 11:04
文章标签 二叉树 力扣 172 叶子

本文主要是介绍172.二叉树:左叶子之和(力扣),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

代码解决

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr, right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/class Solution {
public:// 计算所有左叶子节点的和int sumOfLeftLeaves(TreeNode* root) {queue<TreeNode*> que;  // 定义一个队列用于广度优先搜索if (root != nullptr) que.push(root);  // 如果根节点不为空,将其加入队列int sum = 0;  // 用于累加左叶子节点的和// 当队列不为空时进行循环while (!que.empty()) {int size = que.size();  // 获取当前队列的大小TreeNode* node;  // 用于存储当前节点// 遍历当前层的所有节点for (int i = 0; i < size; i++) {node = que.front();  // 取出队列的头节点que.pop();  // 弹出头节点// 如果左子节点存在if (node->left) {que.push(node->left);  // 将左子节点加入队列// 如果左子节点是叶子节点,累加其值到sumif (node->left->left == nullptr && node->left->right == nullptr) {sum += node->left->val;}}// 如果右子节点存在,将其加入队列if (node->right) que.push(node->right);}} return sum;  // 返回左叶子节点的和}
};
  • TreeNode 结构体定义

    • val:节点的整数值。
    • left:指向左子节点的指针。
    • right:指向右子节点的指针。
  • Solution 类

    • 包含一个公有方法 sumOfLeftLeaves
  • sumOfLeftLeaves 方法

    • 使用广度优先搜索(BFS)来遍历二叉树。
    • 定义一个队列 que 来存储节点,用于层次遍历。
    • 如果根节点不为空,将其加入队列。
    • 初始化 sum 为 0,用于累加左叶子节点的值。
    • 当队列不为空时,进行循环:
      • 获取当前层的节点数量 size
      • 遍历当前层的所有节点:
        • 取出队列的头节点 node 并弹出。
        • 如果左子节点存在:
          • 将左子节点加入队列。
          • 如果左子节点是叶子节点,将其值累加到 sum
        • 如果右子节点存在,将其加入队列。
    • 返回 sum,即所有左叶子节点的和。

方法二 

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr, right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/class Solution {
public:// 计算所有左叶子节点的和int sumOfLeftLeaves(TreeNode* root) {// 如果根节点为空,返回0if (root == nullptr) return 0;// 如果根节点是叶子节点(不算作左叶子),返回0if (root->left == nullptr && root->right == nullptr) return 0;// 递归计算左子树中左叶子节点的和int leftval = sumOfLeftLeaves(root->left);// 如果左子节点存在且是叶子节点,直接取其值if (root->left && root->left->left == nullptr && root->left->right == nullptr) {leftval = root->left->val;}// 递归计算右子树中左叶子节点的和int rightval = sumOfLeftLeaves(root->right);// 返回左子树和右子树中左叶子节点的和int sum = leftval + rightval;return sum;}
};

sumOfLeftLeaves 方法

  • 递归计算二叉树中所有左叶子节点的和。
  • 如果根节点为空,返回 0。
  • 如果根节点是叶子节点,返回 0(因为根节点不算作左叶子)。
  • 递归计算左子树中左叶子节点的和 leftval
  • 如果左子节点存在且是叶子节点,直接取其值。
  • 递归计算右子树中左叶子节点的和 rightval
  • 返回左子树和右子树中左叶子节点的和。

这篇关于172.二叉树:左叶子之和(力扣)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1044990

相关文章

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

两数之和--力扣1

两数之和 题目思路C++代码 题目 思路 根据题目要求,元素不能重复且不需要排序,我们这里使用哈希表unordered_map。注意题目说了只对应一种答案。 所以我们在循环中,使用目标值减去当前循环的nums[i],得到差值,如果我们在map中能够找到这个差值,就说明存在两个整数的和为目标值。 如果没有找到,就将当前循环的nums[i]以及下标i放入map中,以便后续查

PHP实现二叉树遍历(非递归方式,栈模拟实现)

二叉树定义是这样的:一棵非空的二叉树由根结点及左、右子树这三个基本部分组成,根据节点的访问位置不同有三种遍历方式: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(PostorderT

力扣第347题 前K个高频元素

前言 记录一下刷题历程 力扣第347题 前K个高频元素 前K个高频元素 原题目: 分析 我们首先使用哈希表来统计数字出现的频率,然后我们使用一个桶排序。我们首先定义一个长度为n+1的数组,对于下图这个示例就是长度为7的数组。为什么需要一个长度为n+1的数组呢?假如说总共有三个数字都为1,那么我们需要把这个1放在数组下标为3的位置,假如说数组长度为n,对于这个例子就是长度为3,那么它的

【数据结构与算法 | 灵神题单 | 删除链表篇】力扣3217, 82, 237

总结,删除链表节点问题使用到列表,哈希表,递归比较容易超时,我觉得使用计数排序比较稳,处理起来也不是很难。 1. 力扣3217:从链表中移除在数组中的节点 1.1 题目: 给你一个整数数组 nums 和一个链表的头节点 head。从链表中移除所有存在于 nums 中的节点后,返回修改后的链表的头节点。 示例 1: 输入: nums = [1,2,3], head = [1,2,3,

[数据集][目标检测]智慧农业草莓叶子病虫害检测数据集VOC+YOLO格式4040张9类别

数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):4040 标注数量(xml文件个数):4040 标注数量(txt文件个数):4040 标注类别数:9 标注类别名称:["acalcerosis","fertilizer","flower","fruit","grey

力扣 739. 每日温度【经典单调栈题目】

1. 题目 理解题意: 1.1. 给一个温度集合, 要返回一个对应长度的结果集合, 这个结果集合里面的元素 i 是 当前 i 位置的元素的下一个更高温度的元素的位置和当前 i 位置的距离之差, 若是当前元素不存在下一个更高温度的元素, 则这个位置用0代替; 2. 思路 本题用单调栈来求解;单调栈就适用于来求当前元素左边或者右边第一个比当前元素大或者小的元素;【单调栈:让栈中的元素保持单调

在二叉树中找到两个节点的最近公共祖先(基于Java)

如题  题解 public int lowestCommonAncestor(TreeNode root, int o1, int o2) {//记录遍历到的每个节点的父节点。Map<Integer, Integer> parent = new HashMap<>();Queue<TreeNode> queue = new LinkedList<>();parent.put(roo

数据结构--二叉树(C语言实现,超详细!!!)

文章目录 二叉树的概念代码实现二叉树的定义创建一棵树并初始化组装二叉树前序遍历中序遍历后序遍历计算树的结点个数求二叉树第K层的结点个数求二叉树高度查找X所在的结点查找指定节点在不在完整代码 二叉树的概念 二叉树(Binary Tree)是数据结构中一种非常重要的树形结构,它的特点是每个节点最多有两个子节点,通常称为左子节点和右子节点。这种结构使得二叉树在数据存储和查找等方面具

力扣接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 示例 2: 输入:height