左叶子之和 找左下角的值 路径总和

1.计算给定二叉树的所有左叶子之和。

#include <bits/stdc++.h>
using namespace std;
struct TreeNode{
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x)
    {
        val=x;
        left=NULL;
        right=NULL;
    }
};
int findsum(TreeNode* root)
{
    if(root==NULL)
    return 0;
    if(root->left==NULL&&root->right==NULL)
    return 0;
    int leftnum=findsum(root->left);
    if(root->left&&!root->left->left&&!root->left->right)
    {
        leftnum=root->left->val;
    }
    int rightnum=findsum(root->right);
    int sum=leftnum+rightnum;
    return sum;    
}
int main()
{
    TreeNode* root=new TreeNode(1);
    root->left=new TreeNode(2);
    root->right=new TreeNode(3);
    root->left->left=new TreeNode(4);
    root->left->right=new TreeNode(6);
    root->left->right->right=new TreeNode(7);
    root->right->left=new TreeNode(5);
    int sum=findsum(root);
    cout<<sum;
    return 0;
}

思路:首先我们要搞清楚左叶子,即左右子树的左侧叶子结点,特征就是没有左右孩子,且在父结点的左侧,另外在判断左叶子时我们只能借助于父结点,因为在遍历到叶子结点时我们无法判断其是左叶子还是右叶子,在这里我们就用到后序遍历,通过递归函数的返回值来累加求取左叶子数值之和。

当结点为空时,左叶子一定是0,当为叶子结点时左叶子也是0,只有当遍历到父结点且其含有左叶子时,返回其值。

2.给定一个二叉树,在树的最后一行找到最左边的值。

#include <bits/stdc++.h>
using namespace std;
struct TreeNode{
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x)
    {
        val=x;
        left=NULL;
        right=NULL;
    }
};
int findValue(TreeNode* root)
{
    queue<TreeNode*> que;
    int result=0;
    if(root!=NULL)
    {
        que.push(root);
    }
    while(!que.empty())
    {
        int size=que.size();
        for(int i=0;i<que.size();i++)
        {
            TreeNode* node=que.front();
            que.pop();
            if(i==0)
            result=node->val;
            if(node->left)
            que.push(node->left);
            if(node->right)
            que.push(node->right);
         } 
    }
    return result;
}
int main()
{
    TreeNode* root=new TreeNode(1);
    root->left=new TreeNode(2);
    root->right=new TreeNode(3);
    root->left->left=new TreeNode(4);
    root->left->right=new TreeNode(6);
    root->left->right->right=new TreeNode(7);
    root->right->left=new TreeNode(5);
    cout<<findValue(root);
    return 0;
}

思路:这道题的左下角的值我们要知道指的是深度最大的那一行的最左侧的值,那么其实不找深度最大的一行的第一个元素就行了,因而层序遍历显得比较适合。

层序遍历之前已经提到过就不多赘述了,就只是在此基础上修改了一小部分,就是取每一层的第一个元素给result,会逐层覆盖,最终输出的就是最后一层的第一个元素了。

3.给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。

#include <bits/stdc++.h>
using namespace std;
struct TreeNode{
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x)
    {
        val=x;
        left=NULL;
        right=NULL;
    }
};
bool isGoal(TreeNode* root,int target)
{
    if(root->left==NULL&&root->right==NULL&&target==0)
    return true;
    if(root->left==NULL&&root->right==NULL&&target!=0)
    return false;
    if(root->left)
    {
        target-=root->left->val;
        if(isGoal(root->left,target))
        return true;
        target+=root->left->val;
     } 
    if(root->right)
    {
        target-=root->right->val;
        if(isGoal(root->right,target))
        return true;
        target+=root->right->val;
    }
    return false;
    
 } 
bool hasPathSum(TreeNode* root,int sum)
{
    if(root==NULL)
    return false;
    return isGoal(root,sum-root->val);
}
int main()
{
    TreeNode* root=new TreeNode(1);
    root->left=new TreeNode(2);
    root->right=new TreeNode(3);
    root->left->left=new TreeNode(7);
    root->left->right=new TreeNode(5);
    cout<<((hasPathSum(root,10)==1)?"true":"false");
    return 0;
}
思路:这里我们可以这样想,开始遍历时,将目标值target传入,如果存在根节点就先用target减去其val值,先遍历左子树,此时遍历到根节点时减去其左子树的值,之后每遍历一个左节点就继续减去它的左子树的值,直到叶子节点时,如果此时target为0,那么就说明存有路径和为target,返回true,否则就进行回溯,将target回复原来的值转而向另外的路径探索看是否存有这样的路径,遍历右子树也是如此,注意这里我们如果找到了符合的路径,但仍未遍历完整棵树,也是直接返回true,不必继续遍历。


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/73482.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Matlab实现RIME-CNN-LSTM-Multihead-Attention多变量多步时序预测

SCI一区级 | Matlab实现RIME-CNN-LSTM-Multihead-Attention多变量多步时序预测 目录 SCI一区级 | Matlab实现RIME-CNN-LSTM-Multihead-Attention多变量多步时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现RIME-CNN-LSTM-Multihead-Attention霜冰算法…

996引擎-自定义属性-方法2:setitemcustomabil

996引擎-自定义属性-方法2:setitemcustomabil 先看下效果测试NPC补全测试代码辅助表公式setitemcustomabil 总结参考资料先看下效果 测试NPC 为了方便测试,先准备个NPC require("Envir/QuestDiary/ex/init.lua"); require("Envir/QuestDiary/utils/init.lu…

苹果电脑杀毒软件CleanMyMac

杀毒软件在苹果家族中是一个小众软件&#xff0c;百度搜索苹果电脑杀毒软件&#xff0c;可能各种杀软良莠不齐&#xff0c;因为在这个市场非常小&#xff0c;绝大多数都是冲着“清理”去的&#xff0c;而不是杀毒。最近测试了一款Mac电脑杀毒软件&#xff0c;杀毒效果也是一般般…

pandas表格内容比较

前阵子来了一个211大学实习生&#xff08;小男生&#xff09;&#xff0c;要比较2个版本字段的变化&#xff0c;辅助完成系统升级字段替换&#xff0c;要求找出哪些字段是新增的&#xff0c;哪些字段是删除的&#xff0c;哪些字段是属性信息修改的&#xff0c;要求半天时间搞定…

【SpringBoot】最佳实践——JWT结合Redis实现双Token无感刷新

JWT概览 JWT概念 JWT是全称是JSON WEB TOKEN&#xff0c;是一个开放标准&#xff0c;用于将各方数据信息作为JSON格式进行对象传递&#xff0c;可以对数据进行可选的数字加密&#xff0c;可使用RSA或ECDSA进行公钥/私钥签名。JWT最常见的使用场景就是缓存当前用户登录信息&am…

面试系列|蚂蚁金服技术面【1】

哈喽&#xff0c;大家好&#xff01;今天分享一下蚂蚁金服的 Java 后端开发岗位真实社招面经&#xff0c;复盘面试过程中踩过的坑&#xff0c;整理面试过程中提到的知识点&#xff0c;希望能给正在准备面试的你一些参考和启发&#xff0c;希望对你有帮助&#xff0c;愿你能够获…

eBPF 实时捕获键盘输入

eBPF 实时捕获键盘输入 本文将带你一步步实现一个基于eBPF kprobe的键盘记录功能&#xff0c;通过Go语言配合libbpfgo&#xff0c;你将学会如何无损地监控系统键盘输入&#xff0c;并从中获取实时数据&#xff0c;进一步提高系统安全和监控能力。 1. 说明 本文属于专栏 Go语言…

APB-清华联合腾讯等机构推出的分布式长上下文推理框架

APB (Accelerating Distributed Long-Context Inference by Passing Compressed Context Blocks acrossGPUs)是清华大学等机构联合提出的分布式长上下文推理框架。通过稀疏注意力机制和序列并行推理方式&#xff0c;有效解决了大模型处理长文本时的效率瓶颈。APB采用更小的Anch…

数据库分库分表介绍

分库分表是解决数据库性能瓶颈的常用技术手段&#xff0c;主要用于应对数据量过大、读写压力过高的问题。通过将数据分散到多个数据库或表中&#xff0c;可以提高系统的扩展性和性能。 1. 分库分表的核心概念 &#xff08;1&#xff09;分库 定义&#xff1a;将数据分散到多个…

#mapreduce打包#maven:could not resolve dependencies for project

打包报错&#xff1a; #报错信息&#xff1a; [ERROR] Failed to execute goal on project mapreduce_teacher1: Could not resolve dependencies for project org.example:mapreduce_teacher1:jar:1.0-SNAPSHOT: Failed to collect dependencies at org.apache.hive:hive-exe…

Rabit

之前发过rabit了&#xff0c;所以这里不再赘述&#xff0c;讲讲原理 在线Rabbit加密 | Rabbit解密- 在线工具 (sojson.com) rabbit加密原理 Rabbit加密算法是一种流密码算法&#xff0c;由Daniel J. Bernstein设计&#xff0c;并被广泛用于多种加密和安全通信应用中。它的设…

【A2DP】深入解读A2DP中通用访问配置文件(GAP)的互操作性要求

目录 一、模式支持要求 1.1 发现模式 1.2 连接模式 1.3 绑定模式 1.4 模式间依赖关系总结 1.5 注意事项 1.6 协议设计深层逻辑 二、安全机制&#xff08;Security Aspects&#xff09; 三、空闲模式操作&#xff08;Idle Mode Procedures&#xff09; 3.1 支持要求 …

模型蒸馏系列——开源项目

推荐项目&#xff1a;MiniMind&#xff08;低成本全流程训练框架&#xff09; GitHub&#xff1a;https://github.com/jingyaogong/minimind 核心特性&#xff1a;完整实现从数据清洗到模型部署的全流程&#xff0c;支持单卡低成本训练&#xff0c;代码全透明&#xff0c;适合…

【软考-架构】13.1、软件架构概述-构件技术

✨资料&文章更新✨ GitHub地址&#xff1a;https://github.com/tyronczt/system_architect 文章目录 ✨【重点】系统架构设计软件架构概述软件架构设计与生命周期构件&#x1f31f;软件架构风格数据流风格调用/返回风格独立构件风格虚拟机风格仓库风格闭环控制风格C2体系结…

《Android启动侦探团:追踪Launcher启动的“最后一公里”》

1. 开机仪式的“黑屏悬案” 当Android设备完成开机动画后&#xff0c;某些产品会陷入诡异的“黑屏时刻”——仿佛系统在玩捉迷藏。此时&#xff0c;**Launcher&#xff08;桌面&#xff09;**就是躲猫猫的主角。我们的任务&#xff1a;揪出Launcher何时完成启动&#xff0c;终…

Redis事务与管道

Redis事务 可以一次执行多个命令&#xff0c;本质是一组命令的集合。一个事务中的所有命令都会序列化&#xff0c;按顺序地串行执行而不会被其他命令插入&#xff0c;不许加塞。 一个队列中&#xff0c;一次性、顺序性、排他性的执行一系列命令。 Redis事务VS数据库事务 常用…

掌握这些 UI 交互设计原则,提升产品易用性

在当今数字化时代&#xff0c;用户对于产品的体验要求越来越高&#xff0c;UI 交互设计成为决定产品成败的关键因素之一。一个易用的产品能够让用户轻松、高效地完成各种操作&#xff0c;而实现这一目标的核心在于遵循一系列科学合理的 UI 交互设计原则。本文将详细阐述简洁性、…

Alembic 实战指南:快速入门到FastAPI 集成

一、快速开始 1.1 简介 Alembic 是一个基于 SQLAlchemy 的数据库迁移工具&#xff0c;主要用于管理数据库模式&#xff08;Schema&#xff09;的变更&#xff0c;例如新增表、修改字段、删除索引等&#xff0c;确保数据库结构与应用程序的 ORM 模型保持一致。 Alembic 通过版…

LRU(最近最少使用)算法实现

核心思想与基本思路 LRU&#xff08;Least Recently Used&#xff09;算法是一种缓存淘汰策略&#xff0c;其核心思想是淘汰最近最少使用的数据。 最近使用原则&#xff1a;最近被访问的数据在未来被访问的概率更高&#xff0c;因此应保留在缓存中。淘汰机制&#xff1a;当缓…

现在有分段、句子数量可能不一致的中英文文本,如何用python实现中英文对照翻译(即每行英文对应相应的中文)

以下是处理分段且中英文句子数量可能不一致的文本的Python实现方案&#xff0c;包含分句、翻译和对齐功能&#xff1a; from googletrans import Translator import redef split_paragraphs(text):"""按空行分割段落并清洗"""return [p.strip()…