二刷代码随想录训练营Day 16|513.找树左下角的值、112.路径总和、106.从中序与后序遍历序列构造二叉树

news2025/1/17 3:40:47

1.找到左下角的值

 513. 找树左下角的值 - 力扣(LeetCode)
代码随想录 (programmercarl.com)

代码: 

class Solution {
public:
    int maxDepth = INT_MIN;
    int result;
    // 深度最大,确保是最后一行 先遍历左孩子再遍历右孩子 确保是左下角
    void traversal(TreeNode* node,int Depth){
        if(node->left == NULL && node->right == NULL){
            if(Depth > maxDepth){
                maxDepth = Depth;
                result = node->val;
            }
        }
        if(node->left){
            Depth++;
            traversal(node->left,Depth);
            Depth--;
        }            
        if(node->right){
            Depth++;                
            traversal(node->right,Depth);
            Depth--;
        }
    }
    int findBottomLeftValue(TreeNode* root) {
        traversal(root,0);
        return result;
    }
};

note:深度最大,确保是最后一行 先遍历左孩子再遍历右孩子 确保是左下角

2.路径总和

 112. 路径总和 - 力扣(LeetCode)
代码随想录 (programmercarl.com)

代码:(递归法) 

class Solution {
public:
    bool traversal(TreeNode* node,int sum){
        if(node == NULL) return false;
        if(node->left == NULL && node->right == NULL && sum == node->val){
            return true;
        }
        // 左
        bool left = traversal(node->left,sum - node->val);
        // 右
        bool right = traversal(node->right,sum - node->val);
        return left || right;
        
    }
    bool hasPathSum(TreeNode* root, int targetSum) {
        if(root == NULL) return false;
        return traversal(root,targetSum);
    }
};

note:这里需要注意的点是,要自己确定好自己的递归函数里的参数sum变量是减了当前节点val值呢,还是没有减要在本次函数里操作的。这个就决定了你的终止条件怎么写。

以及,这里的判断是,左右孩子只要有一个满足题意的叶子结点,就算true了!!

代码:(迭代法)

class Solution {
public:
    bool hasPathSum(TreeNode* root, int targetSum) {
        if(root == NULL) return false;
        stack<pair<TreeNode*,int>> st;
        st.push(pair<TreeNode*,int>(root,root->val));
        while(!st.empty()){
            pair<TreeNode*,int> node = st.top();
            st.pop();
            if(!node.first->left && !node.first->right && node.second == targetSum){
                return true;
            }
            // 右
            if(node.first->right){
                st.push(pair<TreeNode*,int>(node.first->right,node.second + node.first->right->val));
            }
            // 左
            if(node.first->left){
                st.push(pair<TreeNode*,int>(node.first->left,node.second + node.first->left->val));
            }
        }
        return false;
    }
};

 note:这里用一个二元组来记录每个结点,以及其对应的路径总和

相关题目练习 

 113. 路径总和 II - 力扣(LeetCode)

代码:递归法 

class Solution {
public:
    vector<vector<int>> result;
    void traversal(TreeNode* node,int sum,vector<int> &path){
        if(node == NULL) return;
        if(!node->left && !node->right && node->val == sum){
            path.push_back(node->val);
            result.push_back(path);
            path.pop_back();
            return;
        }
        if(node->left){
            path.push_back(node->val);
            traversal(node->left,sum - node->val,path);
            path.pop_back();
        }
        if(node->right){
            path.push_back(node->val);
            traversal(node->right,sum - node->val,path);
            path.pop_back();
        }
    }
    vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
        vector<int> path;
        traversal(root,targetSum,path);
        return result;
    }
};

note:要遍历整颗树的时候 不需要返回值;不需要遍历整颗树的,需要返回值及时退出递归 

 3.从中序与后序遍历序列构造二叉树 

 106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode)

题目链接/文章讲解/视频讲解:代码随想录

代码: 

/**
 * 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:
    TreeNode* traversal(vector<int>& inorder,vector<int> &postorder){
        if(postorder.size() == 0) return NULL;
        // 找到中序遍历的最后一个元素作为根结点
        int rootValue = postorder[postorder.size() - 1];
        TreeNode* root = new TreeNode(rootValue);
        // 叶子结点
        if(postorder.size() == 1) return root;
        // 找到中序遍历的切割点
        int delimiterIndex;
        for(delimiterIndex = 0; delimiterIndex < inorder.size(); delimiterIndex++){
            if(inorder[delimiterIndex] == rootValue) break;
        }
        // 切割中序数组,得到中序左数组和中序右数组
        vector<int> leftInorder(inorder.begin(),inorder.begin() + delimiterIndex);
        vector<int> rightInorder(inorder.begin() + delimiterIndex + 1,inorder.end());
        // 切割后序数组,得到后序左数组和后序右数组
        postorder.resize(postorder.size() - 1);
        vector<int> leftPostorder(postorder.begin(),postorder.begin() + leftInorder.size());
        vector<int> rightPostorder(postorder.begin() + leftInorder.size(),postorder.end());
        //
        root->left = traversal(leftInorder,leftPostorder);
        root->right = traversal(rightInorder,rightPostorder);
        return root;
    }
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        if(inorder.size() == 0 || postorder.size() == 0) return NULL;
        return traversal(inorder,postorder);
    }
};

 note:

相关题目练习 

 105. 从前序与中序遍历序列构造二叉树 - 力扣(LeetCode)

代码: 

/**
 * 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: // 左闭右开
    TreeNode* traversal(vector<int>& preorder,vector<int>& inorder){
        if(preorder.size() == 0) return NULL;
        // 找到根结点
        int rootValue = preorder[0];
        TreeNode* root = new TreeNode(rootValue);
        // 叶子结点
        if(preorder.size() == 1){
            return root;
        }
        // 找到切割点
        int delimitIndex;
        for(delimitIndex = 0; delimitIndex < inorder.size(); delimitIndex++){
            if(inorder[delimitIndex] == rootValue){
                break;
            }
        }
        // 切割中序遍历数组
        vector<int> leftInoreder(inorder.begin(),inorder.begin() + delimitIndex);
        vector<int> rightInorder(inorder.begin() + delimitIndex + 1,inorder.end());
        // 切割前序遍历数组
        vector<int> leftPreorder(preorder.begin() + 1,preorder.begin() + 1 + leftInoreder.size());
        vector<int> rightPreorder(preorder.begin() + 1 + leftInoreder.size(),preorder.end());
        //
        root->left = traversal(leftPreorder,leftInoreder);
        root->right = traversal(rightPreorder,rightInorder);
        return root;
    }
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        if(preorder.size() == 0 || inorder.size() == 0){
            return NULL;
        }
        return traversal(preorder,inorder);
    }
};

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

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

相关文章

进程地址空间,零基础最最最详解

目录 建议全文阅读&#xff01;&#xff01;&#xff01; 建议全文阅读&#xff01;&#xff01;&#xff01; 建议全文阅读&#xff01;&#xff01;&#xff01; 一、什么是地址空间 1、概念 2、主要组成部分 3、特点和作用 &#xff08;1&#xff09;虚拟化&#xf…

Java并发—volatile关键字

在这篇文章Java并发—Java内存模型以及线程安全-CSDN博客多次提及volatile关键字&#xff0c;这是一个非常重要的概念&#xff0c;主要用于多线程编程中&#xff0c;它确保了变量的可见性和禁止指令重排序&#xff0c;但不保证原子性&#xff0c;下面详细解释volatile关键字的作…

未来3-5年,哪些工作会被AI取代

一篇由高盛经济学家约瑟夫布里格斯 &#xff08;Joseph Briggs&#xff09;和德维西科德纳尼 &#xff08;Devesh Kodnani&#xff09;撰写的报告指出&#xff0c;全球预计将有3亿个工作岗位被生成式AI取代。 报告称&#xff1a;“最近出现的生成式人工智能将降低劳动力成本和…

​宁德时代:续航还剩多少?

车企价格战打到供应商&#xff0c;连续增利不增收。 今天我们看宁德时代的增长电池续航还剩多少&#xff1f; 巨头长成&#xff0c;就要面临增长瓶颈。“宁王”24年中报公布&#xff0c;业绩喜忧参半。二季度营收869.96亿&#xff0c;同比下滑13.18%&#xff0c; 已经是宁德时…

冠军之选:奥运冠军青睐的游泳耳机款式大公开

在最新一届的夏季奥林匹克运动会中&#xff0c;泳池边的激烈竞争再次点燃了全球观众的热情。游泳运动员们&#xff0c;以惊人的速度和毅力&#xff0c;一次又一次地刷新纪录&#xff0c;向世人展示了人类极限的无限可能。而在这些运动员备战的过程中&#xff0c;有一个细节或许…

吴恩达老师机器学习-ex5

有借鉴网上部分博客 首先&#xff0c;我先使用该数据集&#xff0c;通过线性回归的方法&#xff0c;做了一个预测问题 import numpy as np import scipy.io as sio import matplotlib.pyplot as plt from scipy.optimize import minimize#读取数据 path "./ex5data1.ma…

Spine 核心功能入门

核心功能入门 本文主旨是整理我在入手学习 spine 时的流程&#xff0c;以及对于基本功能的理解和常规 2D 动画实现的思路。 意在整理出一个简要的入门 spine 的流程&#xff0c;以及对于一些高阶功能的应用的思考。 本文基于 https://zh.esotericsoftware.com/ 官网教程进行思…

2024.8.1 作业

使用两个线程完成两个文件的拷贝&#xff0c;分支线程1拷贝前一半&#xff0c;分支线程2拷贝后一半&#xff0c;主线程回收两个分支线程的资源 #include <myhead.h>struct Buf {const char *file1;const char *file2;int start;int size; };int get_len(const char *arr…

从线段中搜寻提取闭合轮廓(二)

接上篇文章从线段中搜寻闭合轮廓_多线段搜索区域集合 快速-CSDN博客 1. 前言 调试了上篇文章中参考代码修了一些问题&#xff0c;优化了显示&#xff0c;但是由于算法逻辑存在一些问题&#xff0c;有很多不必要的性能损耗&#xff0c;且逻辑不是最优的&#xff0c;于是博主找…

FPGA开发——蜂鸣器实现音乐播放器的设计

一、概述 我们在进行蜂鸣器的学习的时候&#xff0c;总会在想既然蜂鸣器能够发出声音&#xff0c;那么它能够播放音乐吗&#xff0c;今天这篇我们文章我们就一起来学习怎样使用使用蜂鸣器来播放音乐&#xff0c;也就是怎样成为一个音乐播放器。 1、蜂鸣器的类型 在设计的时候…

玩机进阶教程-----手机恢复出厂 误删除照片视频 误刷机后 几种数据恢复操作步骤解析【一】

手机中存储有众多的照片 视频 文件或者电话本这类的数据,虽然目前很多机型都有云存储。可以随时同步手机的存储数据。但万一云存储没有开启同步或者密码忘记。或者恢复出厂等等原因造成以上的数据丢失。或者手机系统问题导致的不开机但需要其中的数据等等。那么如何简单快速的…

【项目日记(五)】梦幻笔耕-测试报告

❣博主主页: 33的博客❣ ▶️文章专栏分类:项目日记◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多项目内容 目录 1.项目背景2.测试环境3.测试计划3.1功能测试3.2自动化测试 1.项目背景 个人博客系统…

剪画小程序:自媒体创业者的准备-文案!

作为一个刚刚踏入自媒体领域的新人&#xff0c;我满怀着激情和憧憬&#xff0c;渴望通过视频分享自己的见解和生活点滴。然而&#xff0c;视频文案的创作却成了我面前难以逾越的高山。 在构思旅行视频时&#xff0c;面对美丽的风景和丰富的经历&#xff0c;我却无法用恰当的文字…

嵌入式学习Day19---Linux软件编程

目录 一、标准I/O 1.1.fseek 1.偏移量 2.实例 ​编辑 1.2.ftell 2.实例 ​编辑 二、文件I/O 2.1.打开文件 1.open 2.2.实例 2.2.读写文件 1.write 实例 ​编辑 2.read 实例 2.3.关闭文件 1.close 2.3.lseek 实例 三、标准I/O与文件I/O的区别 3.1.区别 四、其…

2024年有哪些开放式耳机值得入手?精选五大高分品牌

近几年兴起的开放式蓝牙耳机&#xff0c;具有佩戴舒适稳固、不影响使用者判断外界环境等优点&#xff0c;十分适合在户外环境下使用&#xff0c;因此受到了众多健身人士的喜爱。那么该如何挑选到一款适合自己的开放式耳机呢&#xff1f;2024年有哪些开放式耳机值得入手&#xf…

【架构】应用保护

这篇文章总结一下应用保护的手段。如今说到应用保护&#xff0c;更多的会想到阿里的sentinel&#xff0c;手段丰富&#xff0c;应用简单。sentinel的限流、降级、熔断&#xff0c;可以自己去试一下&#xff0c;sentinel主要通过配置实现功能&#xff0c;不难。sentinel的简介放…

Qt如何在工程中使用dll库

DEMO&#xff1a;Test &#xff1b;工程与dll皆为qmake编译&#xff1b; 所需文件&#xff1a;A.dll、A.lib、A.h、A_global.h&#xff1b;B.dll。其中A.dll 依赖 B.dll 1. 环境配置 &#xff08;1&#xff09;确认制作dll的Qt版本和当前工程版本是否一致(Qt6中的一些函数Qt…

SLAM中的概率基础(知识回顾)

今天有些知识点忘记了&#xff0c;特地过来回顾一下&#xff0c;于是就做了这些笔记。 为了方便能够在手机上更直观的看笔记&#xff0c;写下这篇文章&#xff0c;有错误请各位大佬指出。 一、 概率基础概念 1.1. 概率密度函数&#xff08;PDF&#xff09; 概率密度函数用于…

第十九次(安装nginx代理tomcat)

回顾 1.安装nodejs---jdk一样你的软件运行环境 yum -y list install|grep epel $? yum -y install nodejs #版本号 node -v 2.下载对应的nodejs软件npm yum -y install npm npm -v npm set config ...淘宝镜像 3.安装vue/cli command line interface 命令行接口 npm ins…

推荐4个国内可用的AI软件,用上以后都能早点下班

随着技术的发展&#xff0c;越来越多的AI软件出现在人们的视野&#xff0c;应用的领域更多&#xff0c;能力提升也更快&#xff0c;用在工作上能帮不少忙。下面就给大家分享4个国内可以直接使用的AI软件&#xff0c;希望大家啊用上以后都能早点下班~ 1.Kimi 一键直达>>h…