14,.左下角的值,路径和,由序列确定树

news2025/2/13 12:42:32

找树左下角的值

迭代法

  • 层序遍历
class Solution {
public:
    int findBottomLeftValue(TreeNode* root) {
        queue<TreeNode*> qu;
        qu.push(root);
        TreeNode* left=qu.front();
        while(!qu.empty()){
            int sz=qu.size();
            left=qu.front();
            for(int i=0;i<sz;i++){
                TreeNode* cur=qu.front();
                qu.pop();
                if(cur->left)qu.push(cur->left);
                if(cur->right)qu.push(cur->right);
            }
        }
        return left->val;
    }
};

递归法

  • 先序遍历,记录深度最深的。
class Solution {
public:
    int preorder(TreeNode* root,int depth,int& maxDep){
        if(!root)return 0;
        depth++;
        if(!root->left&&!root->right){
            if(depth>maxDep){
                maxDep=depth;
                return root->val;
            }else{
                return -1;
            }
        }
        int le=-1,ri=-1;
        if(root->left){
            le=preorder(root->left,depth,maxDep);
        }
        if(root->right){
            ri=preorder(root->right,depth,maxDep);
        }
        if(ri==-1)ri=le;
        return ri;
    }
    int findBottomLeftValue(TreeNode* root) {
        int maxDep=0;
        return preorder(root,0,maxDep);
    }
};

路径总和

递归

class Solution {
public:
    bool preorder(TreeNode* root,int sum,int tar){
        sum+=root->val;
        
        if(!root->left&&!root->right){
            if(sum==tar)return 1;
            return 0;
        }
        int left=0,right=0;
        if(root->left)left=preorder(root->left,sum,tar);
        if(root->right)right=preorder(root->right,sum,tar);
        return left||right;
    }
    bool hasPathSum(TreeNode* root, int targetSum) {
        if(!root)return 0;
        return preorder(root,0,targetSum);
    }
};

迭代

class Solution {
public:
   
    bool hasPathSum(TreeNode* root, int targetSum) {
        stack<int> numst;
        stack<TreeNode*> st;
        if(!root)return 0;
        st.push(root);
        numst.push(root->val);
        while(!st.empty()){
            TreeNode* cur=st.top();
            st.pop();
            int cur_sum=numst.top();
            numst.pop();
            if(!cur->left&&!cur->right){
                if(cur_sum==targetSum)return 1;
            }
            if(cur->right){
                st.push(cur->right);
                numst.push(cur_sum+cur->right->val);
            }
            if(cur->left){
                st.push(cur->left);
                numst.push(cur_sum+cur->left->val);
            }
        }
        return 0;
    }
};

变体题

迭代和递归思路差不多

class Solution {
public:
    vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
        stack<int> numst;
        stack<vector<int>> vst;
        vector<vector<int>> res;
        stack<TreeNode*> st;
        if(!root)return res;
        st.push(root);
        vector<int> roo;
        roo.push_back(root->val);
        vst.push(roo);
        numst.push(root->val);
       while(!st.empty()){
            TreeNode* cur=st.top();
            st.pop();
            int cur_sum=numst.top();
            numst.pop();
            vector<int> cur_v=vst.top();
            vst.pop();
            if(!cur->left&&!cur->right){
                if(cur_sum==targetSum){
                    res.push_back(cur_v);
                }
            }
            vector<int> tmp=cur_v;
            if(cur->right){
                st.push(cur->right);
                numst.push(cur_sum+cur->right->val);
                cur_v.push_back(cur->right->val);
                vst.push(cur_v);
            }
            cur_v=tmp;
            if(cur->left){
                st.push(cur->left);
                numst.push(cur_sum+cur->left->val);
                cur_v.push_back(cur->left->val);
                vst.push(cur_v);
            }
        }
        return res;
    }
};

由序列构造二叉树

中序与后序

class Solution
{
public:
    TreeNode *build(vector<int>& inorder, vector<int>& postorder){
        if (inorder.empty())
            return nullptr;
        int val = postorder[postorder.size() - 1];
        TreeNode *root = new TreeNode(val);
        
        vector<int>::iterator it = std::find(inorder.begin(), inorder.end(), val);
        if(it==inorder.end())return nullptr;
        vector<int> left(inorder.begin(), it++);
        vector<int> right(it, inorder.end());
        postorder.pop_back();

        root->right = build(right, postorder);
        root->left = build(left, postorder);
        
        
        return root;
    }
    TreeNode *buildTree(vector<int>& inorder, vector<int>& postorder)
    {
        return build(inorder,postorder);
    }
};

image-20250212220115045

前序与中序

可以轻松写成类似代码

class Solution {
public:
    int count=0;
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        if(preorder.empty()||inorder.empty())return nullptr;
        int val=preorder[count++];
        auto it=find(inorder.begin(),inorder.end(),val);
        TreeNode* root=new TreeNode(val);
        vector<int> left(inorder.begin(),it);
        vector<int> right(++it,inorder.end());
        root->left=buildTree(preorder,left);
        root->right=buildTree(preorder,right);
        return root;
    }
};

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

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

相关文章

【推理llm论文精读】DeepSeek V3技术论文_精工见效果

先附上原始论文和效果对比https://arxiv.org/pdf/2412.19437 摘要 (Abstract) DeepSeek-V3是DeepSeek-AI团队推出的最新力作&#xff0c;一个强大的混合专家&#xff08;Mixture-of-Experts&#xff0c;MoE&#xff09;语言模型。它拥有671B的总参数量&#xff0c;但每个tok…

python自动化测试之Pytest框架之YAML详解以及Parametrize数据驱动!

一、YAML详解 YAML是一种数据类型&#xff0c;它能够和JSON数据相互转化&#xff0c;它本身也是有很多数据类型可以满足我们接口 的参数类型&#xff0c;扩展名可以是.yml或.yaml 作用&#xff1a; 1.全局配置文件 基础路径&#xff0c;数据库信息&#xff0c;账号信息&…

DeepSeek 本地部署指南

在人工智能飞速发展的今天&#xff0c;大语言模型的应用越来越广泛。DeepSeek 作为一款强大的大语言模型&#xff0c;具备出色的语言理解和生成能力。然而&#xff0c;许多用户希望能够在本地部署 DeepSeek&#xff0c;以实现更高的隐私性、更低的延迟和更好的定制化。本文将为…

[LeetCode]day21 15.三数之和

题目链接 题目描述 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复…

Unity学习part1

课程为b站【Unity教程】零基础带你从小白到超神 1、脚本执行顺序 unity的脚本执行顺序不像blender的修改器那样按顺序执行&#xff0c;而是系统默认给配置一个值&#xff0c;值越小&#xff0c;执行顺序越靠前&#xff08;注意&#xff0c;这个顺序是全局生效的&#xff09; …

【AI论文】10亿参数大语言模型能超越405亿参数大语言模型吗?重新思考测试时计算最优缩放

摘要&#xff1a;测试时缩放&#xff08;Test-Time Scaling&#xff0c;TTS&#xff09;是一种通过在推理阶段使用额外计算来提高大语言模型&#xff08;LLMs&#xff09;性能的重要方法。然而&#xff0c;目前的研究并未系统地分析策略模型、过程奖励模型&#xff08;Process …

Ubuntu20.04上搭建nginx正向代理提供上网服务

背景&#xff1a;公司很多电脑因软件管控问题不得不禁止设备上网&#xff0c;现需搭建上网代理服务器提供给这些用户使用。 操作系统&#xff1a;ubuntu20.04 工具&#xff1a;nginx-1.25.4 1、下载nginx安装包及依赖 由于nginx默认只持支持转发http协议&#xff0c;所以如…

使用 PDF SDK 通过页面分割和数据提取对建筑图纸进行分类

一家专门从事设计和建设的建筑公司对大量多页建筑 PDF 图纸进行分类&#xff0c;从而提高协作和运营效率。 这类公司通常承担多个建筑设计项目&#xff0c;每个项目包含多个设计图纸&#xff0c;如详细的结构计划、电气与水管计划、机械计划等。如果项目图纸可以在上传后自动分…

Linux命名管道与共享内存

命名管道与共享内存 命名管道介绍和基本使用 理解了匿名管道后&#xff0c;命名管道的理解就会变得容易。在前面使用匿名管道时可以发现&#xff0c;之所以可以匿名是因为由父进程创建&#xff0c;子进程拷贝所以子进程和父进程都可以看到这个管道。但是如果对于任意两个进程…

使用 Notepad++ 编辑显示 MarkDown

Notepad 是一款免费的开源文本编辑器&#xff0c;专为 Windows 用户设计。它是替代记事本&#xff08;Notepad&#xff09;的最佳选择之一&#xff0c;因为它功能强大且轻量级。Notepad 支持多种编程语言和文件格式&#xff0c;并可以通过插件扩展其功能。 Notepad 是一款功能…

解锁Rust:融合多语言特性的编程利器

如果你曾为理解Rust的特性或它们之间的协同工作原理而苦恼,那么这篇文章正是为你准备的。 Rust拥有许多令人惊叹的特性,但这些特性并非Rust所独有。实际上,Rust巧妙地借鉴了众多其他语言的优秀特性,并将它们融合成了一个完美的整体。深入了解Rust这些重要特性的来源以及它是…

zyNo.23

SQL注入漏洞 1.SQL语句基础知识 一个数据库由多个表空间组成&#xff0c;sql注入关系到关系型数据库&#xff0c;常见的关系型数据库有MySQL,Postgres,SQLServer,Oracle等 以Mysql为例&#xff0c;输入 mysql-u用户名-p密码 即可登录到MySQL交互式命令行界面。 既然是…

visual studio 在kylin v10上跨平台编译时c++标准库提示缺少无法打开的问题解决

情况1&#xff1a;提示无法打开 源文件 "string"之类导致无法编译 情况2:能编译&#xff0c;但无法打开这些库文件或标准库使用提示下划红色问题 解决方案&#xff1a; 一、通过工具->选项->跨平台里&#xff0c;在“远程标头IntelliSense管理器”更新下载一下…

Spring Cloud — 深入了解Eureka、Ribbon及Feign

Eureka 负责服务注册与发现&#xff1b;Ribbon负责负载均衡&#xff1b;Feign简化了Web服务客户端调用方式。这三个组件可以协同工作&#xff0c;共同构建稳定、高效的微服务架构。 1 Eureka 分布式系统的CAP定理&#xff1a; 一致性&#xff08;Consistency&#xff09;&am…

2025年SEO工具有哪些?老品牌SEO工具有哪些

随着2025年互联网的发展和企业线上营销的日益重要&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;逐渐成为了提高网站曝光率和流量的重要手段。SEO的工作不仅仅是简单地通过关键词优化和内容发布就能够实现的&#xff0c;它需要依赖一系列专业的SEO工具来帮助分析、监测和…

LabVIEW显微镜成像偏差校准

在高精度显微镜成像中&#xff0c;用户常常需要通过点击图像的不同位置&#xff0c;让电机驱动探针移动到指定点进行观察。然而&#xff0c;在实际操作中&#xff0c;经常会遇到一个问题&#xff1a;当点击位于图像中心附近的点时&#xff0c;探针能够相对准确地定位&#xff1…

23页PDF | 国标《GB/T 44109-2024 信息技术 大数据 数据治理实施指南 》发布

一、前言 《信息技术 大数据 数据治理实施指南》是中国国家标准化管理委员会发布的关于大数据环境下数据治理实施的指导性文件&#xff0c;旨在为组织开展数据治理工作提供系统性的方法和框架。报告详细阐述了数据治理的实施过程&#xff0c;包括规划、执行、评价和改进四个阶…

AI代码生成器如何重塑前端开发的工作环境

近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术迅猛发展&#xff0c;深刻地改变着各行各业的工作方式。在软件开发领域&#xff0c;AI写代码工具的出现更是掀起了一场革命&#xff0c;尤其对前端开发工程师的工作环境和协作方式产生了深远的影响。本文将深入探讨AI…

Xcode证书密钥导入

证书干嘛用 渠道定期会给xcode证书&#xff0c;用来给ios打包用&#xff0c;证书里面有记录哪些设备可以打包进去。 怎么换证书 先更新密钥 在钥匙串访问中&#xff0c;选择系统。(选登录也行&#xff0c;反正两个都要导入就是了)。 mac中双击所有 .p12 后缀的密钥&#xff…

Python 基于 OpenCV 的人脸识别上课考勤系统(附源码,部署教程)

博主介绍&#xff1a;✌2013crazy、10年大厂程序员经历。全网粉丝12W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&a…