【递归】12. leetcode 1448 统计二叉树中好节点的数目

server/2024/10/9 11:17:10/

1 题目描述

题目链接:统计二叉树中好节点的数目
在这里插入图片描述

2 解答思路

第一步:挖掘出相同的子问题  (关系到具体函数头的设计)
第二步:只关心具体子问题做了什么  (关系到具体函数体怎么写,是一个宏观的过程)
第三步:找到递归的出口,防止死递归  (关系到如何跳出递归)

2.1 相同的子问题(函数头设计)

相同的子问题:统计二叉树中好节点的数目,就是统计左子树中好节点的数目 加上 右子树中好节点的数目

整体设计:
每次递归的时候需要传递二叉树和走到当前位置过程中遇到的最大的值

因此,函数头的设计如下:

int dfs(TreeNode* root, int mx){}

传入二叉树,和遇到的最大值,返回以当前节点为根节点的二叉树的好节点数目。

2.2 具体的子问题做了什么(函数体的实现)

根据之前的分析,具体的子问题做的事情:
1.统计左子树中好节点的数目
2.统计右子树中好节点的数目
3.返回以该节点为二叉树的好节点的数目(这里需要判断当前节点是不是好节点,同时这里也是递归的一个出口)

//返回二叉树中好节点的数目 = 左子树中好节点的数目 + 右子树中好节点的数目//1.如何判断是不是好节点//2.递归左右子树int dfs(TreeNode* root, int mx){if (root == nullptr)return 0;//判断是不是好节点  --> mx表示这一路下来,所经过节点的最大值int left = dfs(root->left, max(mx, root->val));int right = dfs(root->right, max(mx, root->val));//返回当前节点的好节点的个数return left + right + (mx <= root->val);}

3 总结

class Solution {
public:int goodNodes(TreeNode* root) {return dfs(root, INT_MIN);}//返回二叉树中好节点的数目 = 左子树中好节点的数目 + 右子树中好节点的数目//1.如何判断是不是好节点//2.递归左右子树int dfs(TreeNode* root, int mx){if (root == nullptr)return 0;//判断是不是好节点  --> mx表示这一路下来,所经过节点的最大值int left = dfs(root->left, max(mx, root->val));int right = dfs(root->right, max(mx, root->val));//返回当前节点的好节点的个数return left + right + (mx <= root->val);}
};

在这里插入图片描述


http://www.ppmy.cn/server/126370.html

相关文章

[网络]NAT、代理服务、内网穿透、内网打洞

目录 一、NAT 1.1 NAT 技术背景 1.2 NAT IP 转换过程 1.3 NAPT&#xff08;Network Address Port Translation&#xff09; 1.地址转换表 2. NAPT&#xff08;网络地址端口转换Network Address Port Translation&#xff09; 3. NAT技术的缺陷 二、代理服务器 2.1 正向…

docker进入正在运行的容器,exit后的比较

docker run进去容器&#xff0c;exit退出&#xff0c;容器停止 run运行进去容器&#xff0c;ctrlpq退出&#xff0c;容器不停止。如果加了-d,就守护式启动容器&#xff0c;exit的命令&#xff0c;容器是不会停止的 exec进的容器&#xff0c;exit或者是ctrld,容器不会停止.只是…

Mac安装Manim并运行

1.在macOS上创建Python虚拟环境&#xff0c;可以使用venv模块&#xff0c;这是Python自带的库&#xff0c;也可以使用conda。以下是使用venv创建和使用Python虚拟环境的步骤&#xff1a; 打开终端。 创建一个新的目录来存放你的项目&#xff0c;并进入该目录&#xff1a; mk…

黑马linux笔记(转载)

学习链接 视频链接&#xff1a;黑马程序员新版Linux零基础快速入门到精通 原文链接&#xff1a;黑马程序员新版Linux零基础快速入门到精通——学习笔记 黑马Linux笔记 文章目录 学习链接01初识Linux1.1、操作系统概述1.1.1、硬件和软件1.1.2、操作系统1.1.3、常见操作系统 1.…

next 从入门到精通

next 从入门到精通 相关链接 演示地址 演示地址 源码地址 源码地址 获取更多 获取更多 hello 大家好&#xff0c;我是 数擎科技&#xff0c;今天来跟大家聊聊 Next.js 如果你遇到任何问题&#xff0c;欢迎联系我 m-xiaozhicloud 什么是 Next.js Next.js 是一个基于 Reac…

大数据-149 Apache Druid 基本介绍 技术特点 应用场景

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

UE4完整教程 UE4简介 UE4学习攻略及文件格式

开头附上工作招聘面试必备问题噢~~包括综合面试题、无领导小组面试题资源文件免费!全文干货。 UE4简介学习攻略UE4Demo代码面试内容资源-CSDN文库https://download.csdn.net/download/m0_72216164/89825102 工作招聘无领导小组面试全攻略最常见面试题(第一部分)共有17章+可…

C++学习笔记----8、掌握类与对象(二)---- 成员函数的更多知识(3)

3.3、引用验证的成员函数 通常的成员函数可以被非临时和临时的类实例调用。假设你有如下的类只是记住了string作为参数传递给了构造函数&#xff1a; class TextHolder { public:explicit TextHolder(string text) : m_text { move(text) } {}const string& getText() con…