力扣112、113、101--树

112. 路径总和

题目描述:

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。
判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。
如果存在,返回 true ;否则,返回 false 。

叶子节点 是指没有子节点的节点

方法一:树考虑递归

1.终止条件:到叶子结点且值相等-->true;到叶子结点值不相等--->false;
2.递归关系式 :
    bool root_sum=bool left_sum1 || bool right_sum1
根到叶子的和是否为sum就是左孩子到叶子的和是否为sum—root或右孩子到叶子的和是否为sum—root

所以代码为:

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

方法二:DFS

class Solution {
public:
    bool hasPathSum(TreeNode* root, int targetSum) {
        if(!root) return false;
        return dfs(root,targetSum);
    }
    bool dfs(TreeNode* root, int Sum){
        if(!root) return false ;
        Sum-=root->val;
        if(Sum==0&&!root->left&&!root->right) return true;

        bool leftResult = dfs(root->left, Sum);
        bool rightResult = dfs(root->right, Sum);

        // 如果左子树或右子树存在满足条件的路径,返回true
        if(leftResult || rightResult) {
            return true;
        }
       
        return false;
    }
            
    
};

这里需要注意一下:在递归回溯时,我们不需要将当前节点的值再次加回到sum中。

理解方式:因为在后续调用dfs时sum是个参数,他只是把此时sum的值复制一份传递给下一层递归函数。这意味着后续调用的Sum值是独立的,不会影响到之前的调用

例如:

#include<stdio.h>
using namespace std;

int add(int a,int b){
	return a=a+b;
}

int main(){
	int a=0;
	int c=add(a,3);
	printf("%d",a);
	return 0;
	
} 

113. 路径总和 II

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。

这道题跟上道题的区别在于需要返回路径。其他大体思路差不多,可以直接dfs遍历。

class Solution {
public:
    vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
        dfs(root,targetSum);
        return res;
    }
private:
    vector<vector<int>> res;
    vector<int> path;
    void dfs(TreeNode* root,int tar){
        if(!root) return ;
        path.push_back(root->val);//向下遍历
        tar-=root->val;
        if(tar==0&&!root->left&&!root->right){
            res.push_back(path);
        }//成功
        dfs(root->left,tar);//左
        dfs(root->right,tar);//右
        path.pop_back();//回溯
    }
};

注意这道题里面每次dfs后path需要pop因为path是全局变量 

101. 对称二叉树

注意:这道题不可以用中序遍历,会出现:这种情况

正确做法:左右都存在的情况下,递归的判断,L->right==R->left   R->right==L->left;?

class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if(!root) return true;
        return dfs(root->left,root->right); 
    }
    bool dfs(TreeNode* L,TreeNode* R){
        if(!L&&!R) 
			return true;
		
		if( !L||!R) 
			return false;
	
        if(L->val!=R->val) return false;//member access within null pointer of type 'TreeNode' 不能比较空
        return dfs(L->right,R->left)&&dfs(R->right,L->left);
    }
};

199. 二叉树的右视图

给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

方法一:横向思考:最右边的就是每一层的最右边的一个节点---》层次遍历,每次队列出完一行,一层到最后的时候,就是最右边的节点。

class Solution { // 层序遍历
public:
    vector<int> rightSideView(TreeNode* root) {
        vector<int> res;
        if (!root)
            return res;
        queue<TreeNode*> q;
        TreeNode* visit;
        q.push(root);
        while (!q.empty()) {
            int q_size = q.size();
            for (int i = 0; i < q_size; i++) {
                visit = q.front();
                q.pop();
                if (i == q_size - 1) {
                    res.push_back(visit->val);
                }
                if (visit->left)
                    q.push(visit->left);
                if (visit->right)
                    q.push(visit->right);
            }
        }
        return res;
    }
};

每层结束的判断:

int q_size = q.size();
//确保每次上一层全部遍历完后,立马计算当前队列的大小
if (i == q_size - 1) {
     res.push_back(visit->val);
     }

方法二:纵向思维:

思路: 我们按照 「根结点 -> 右子树 -> 左子树」 的顺序访问,就可以保证每层都是最先访问最右边的节点的。每次新的一层,就将节点的值放入到数组中。

(与先序遍历 「根结点 -> 左子树 -> 右子树」 正好相反,先序遍历每层最先访问的是最左边的节点)

class Solution {
public:
    vector<int> res;
    void pre(TreeNode* root,int deep){
        if(!root) return ;
        if(deep==res.size()) res.push_back(root->val);
        deep++;
        if(root->right) pre(root->right,deep);
        if(root->left) pre(root->left,deep);

    }
    vector<int> rightSideView(TreeNode* root) {
        pre(root,0);
        return res;
    }
};

226. 翻转二叉树

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

​​​​​​​注意:

  1. 在交换左右子树节点值时,应该交换节点指针而不仅仅是节点值。因此,应该使用swap(root->left, root->right)来交换左右子树节点。
  2. 在处理节点的左右子树时,应该先递归地对左右子树进行翻转操作,然后再交换左右子树的位置。因此,在调用invertTree函数之前应该先判断左右子树是否为空。
class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        if (!root) {
            return nullptr;
        }

        // 递归地翻转左右子树
        TreeNode* left = invertTree(root->left);
        TreeNode* right = invertTree(root->right);

        // 交换左右子树
        root->left = right;
        root->right = left;

        return root;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

体系班第十七节(经典递归)

1汉诺塔 从左移到最右&#xff0c;圆盘必须满足小压大原则 写一个大方法&#xff0c;大方法包括两步&#xff1a;第一步将最后一个圆盘上面的所有的放到第二个塔上面&#xff0c;然后将最后一个圆盘放到最后塔上面&#xff0c;再把第二个塔上面圆盘全放在第三个塔上面 #incl…

一文搞懂分布式事务解决方案

前言 在当今的分布式系统中&#xff0c;分布式事务管理是一个关键挑战。在面对跨多个服务的复杂业务流程时&#xff0c;确保数据一致性和事务的原子性变得至关重要。本文将深入探讨分布式事务的概念、原理、实现方式以及在Java领域的应用。 什么是分布式事务 分布式事务是指涉…

leetcode代码记录(动态规划基础题(斐波那契数列)

目录 1. 题目&#xff1a;2. 斐波那契数列&#xff1a;小结&#xff1a; 1. 题目&#xff1a; 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a…

【Spring Boot】创建你的第一个 Spring Boot 应用

创建你的第一个 Spring Boot 应用 1.环境配置2.步骤详解3.项目结构分析3.1 入口类 DemoApplication3.2 控制器 PathVariableController3.3 控制器 BasicController3.4 模型 User 4.运行 Spring Boot 目前已经成为了 Java 开发领域的框架范式。本篇博客&#xff0c;我将带领大家…

c语言:操作符详解(上)

目录 一、操作符的分类二、二进制和进制转换1.2进制转10进制2.10进制转2进制3.2进制转8进制4.2进制转16进制 三、原码、反码、补码四、算术操作符、-、*、/、%1.**和-**2.*3./4.% 五、移位操作符1.左移操作符2.右移操作符 六、位操作符&#xff1a;&、|、^、~七、赋值操作符…

【Linux进程状态】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、直接谈论Linux的进程状态 看看Linux内核源代码怎么说 1.1、R状态 -----> 进程运行的状态 1.2、S状态 -----> 休眠状态(进程在等待“资源”就绪) 1.3、T状…

想兼职赚钱?盘点6个靠谱兼职,赚钱更轻松!

1&#xff0c;微头条搬砖 微头条搬砖是一个门槛不高的赚钱方式&#xff0c;而且不需要你有多么好的原创能力&#xff0c;去收集一些热门文章的素材进行文章伪原创&#xff0c;十分钟就能搞定&#xff0c;只要你的文章有爆点&#xff0c;足够吸人眼球&#xff0c;就能够获取不低…

liunx离线安装mysql

liunx离线安装mysql 一.安装二.添加系统mysql组和mysql用户三.创建并修改mysql数据目录四.修改目录权限五.初始化数据库如果报错关于libaio.so.1六.修改权限为root七.添加启动服务**八.** ***\*登录数据库\**** 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&a…

OpenHarmony 鸿蒙操作系统初体验

一、测试环境 硬件&#xff1a;野火开发板 RK3568 &#xff0c;LubanCat2-N 系统&#xff1a;OpenHarmony_3.2.3 二、驱动安装 下载驱动 Rockchip_DriverAssitant_v5.1.1&#xff0c;并安装。 安装完成 三、镜像烧录 准备工作 注&#xff1a;仅支持烧录镜像到EMMC&…

Arthas使用案例(二)

说明&#xff1a;记录一次使用Arthas排查测试环境正在运行的项目BUG&#xff1b; 场景 有一个定时任务&#xff0c;该定时任务是定时去拉取某FTP服务器上的文件&#xff0c;进行备份、读取、解析等一系列操作。 而现在&#xff0c;因为开发环境是Windows&#xff0c; 线上项…

代码随想录 -- 回溯算法

文章目录 回溯算法理论什么是回溯法回溯法的效率回溯法解决的问题理解回溯法回溯法模板 组合问题I描述题解优化 组合总和III描述题解 电话号码的字母组合描述题解 组合总和描述题解 组合总和II描述题解 分割回文串描述题解 复原IP地址描述题解 子集描述题解 子集II描述题解 递增…

Linux 学习笔记(16)

十六、 计划任务 在很多时候为了自动化管理系统&#xff0c;我们都会用到计划任务&#xff0c;比如关机&#xff0c;管理&#xff0c;备份之类的操作&#xff0c;我 们都可以使用计划任务来完成&#xff0c;这样可以是管理员的工作量大大降低&#xff0c;而且可靠度更好。 l…

软件测试之学习测试用例的设计(等价类法、边界值法、错误猜测法、场景法、因果图法、正交法)

1. 测试用例的概念 软件测试人员向被测试系统提供的一组数据的集合&#xff0c;包括 测试环境、测试步骤、测试数据、预期结果 2. 为什么在测试前要设计测试用例 测试用例是执行测试的依据 在回归测试的时候可以进行复用 是自动化测试编写测试脚本的依据 衡量需求的覆盖率…

通过简单的案例入门Mybatis~

目录 一.概述 二.JDBC的缺点 三.案例 1.创建测试类 2.加载Mybatis核心配置文件获取SqlSessionFactory 3.获取SqlSession对象 4.执行sql 5.释放资源 一.概述 Mybatis是一款持久层框架&#xff0c;用于简化JDBC开发。所谓框架&#xff0c;就是一个半成品软件&#xff0c;…

2024年【P气瓶充装】考试资料及P气瓶充装考试总结

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年P气瓶充装考试资料为正在备考P气瓶充装操作证的学员准备的理论考试专题&#xff0c;每个月更新的P气瓶充装考试总结祝您顺利通过P气瓶充装考试。 1、【多选题】CNG双燃料汽车系统主要包括&#xff08;&#xff…

数据链路层_以太网

IP协议确定数据跨网络从主机A到主机B的路径&#xff0c;即IP协议解决了路径选择问题&#xff0c;但在这之前&#xff0c;必须先解决数据在一个子网内的传输的问题。跨网络的本质就是跨多个子网&#xff0c;只要一个子网内可以通信&#xff0c;那么便可以跨网络通信。 一.以太…

Echarts+Vue 首页大屏静态示例Demo 第四版 支持自适应

效果: 源码: <template><ScaleScreenclass="scale-wrap":selfAdaption="true":autoScale="true":class="{ fullscreen-container: isFullScreen }"><div class="bg"><dv-loading v-if="loading&…

Docker 中 MySQL 的部署与管理

目录 一、Docker 中部署 MySQL1.1 部署 MySQL1.2 进入容器并创建数据库1.3 Navicat 可视化工具连接 二、可能存在的问题2.1 1130 - Host ‘172.17.0.1‘ is not allowed to connect to this MySQL server 参考资料 一、Docker 中部署 MySQL 1.1 部署 MySQL 首先&#xff0c;从…

[题解]无厘头题目——无聊的军官

这道题非常无厘头&#xff01; 题目描述&#xff1a; 每个学年的开始&#xff0c;高一新生们都要进行传统的军训。今年有一个军训教官十分奇怪&#xff0c;他为了测试学员们的反应能力&#xff0c;每次吹哨后学员们都会变换位置。每次左数第I位学员都会站到第ai个位置&#x…

代码随想录训练营Day25:● 216.组合总和III ● 17.电话号码的字母组合

216.组合总和III 题目链接 https://leetcode.cn/problems/combination-sum-iii/description/ 题目描述 思路 自己写的效率会慢一些&#xff0c;而且没有用到剪枝 class Solution {List<List<Integer>> list new ArrayList<>();List<Integer> lis…