当前位置:网站首页>leetcode:250. 统计同值子树
leetcode:250. 统计同值子树
2022-08-04 14:31:00 【OceanStar的学习笔记】
题目来源
题目描述

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{
int countUnivalSubtrees(TreeNode* root){
}
};
题目解析

思路
- 首先,叶子节点都是同值子树
- 然后,对于非叶子节点:
- 如果仅仅存在左子树,那么必须左子树是同值子树&&左子树的节点值必须等于当前节点的值
- 如果仅仅存在右子树,那么必须右子树是同值子树&&右子树的节点值必须等于当前节点的值
- 如果存在左右子树,那么必须左右子树都是同值子树&&左子树的节点值必须等于当前节点的值&&右子树的节点值必须等于当前节点的值
实现
class Solution{
struct Info{
bool isUnival;
int cnt;
int val;
Info(bool isUnival, int cnt, int val) : isUnival(isUnival), cnt(cnt), val(val){
}
};
Info *process(TreeNode* root){
if(root == nullptr){
return nullptr;
}
auto left = process(root->left);
auto right = process(root->right);
int cnt = 0;
bool isUnival = false;
if(left == nullptr && right == nullptr){
isUnival = true;
cnt = 1;
}else if(left == nullptr){
isUnival = right->isUnival && right->val == root->val;
cnt = (isUnival? 1 : 0) + right->cnt;
}else if(right == nullptr){
isUnival = left->isUnival && left->val == root->val;
cnt = (isUnival? 1 : 0) + left->cnt;
}else{
isUnival = right->isUnival && right->val == root->val && left->isUnival && left->val == root->val;
cnt = (isUnival? 1 : 0) + left->cnt + right->cnt;
}
return new Info(isUnival, cnt, root->val);
}
public:
int countUnivalSubtrees(TreeNode* root){
if(root == nullptr){
return 0;
}
return process(root)->cnt;
}
};
测试
int main() {
TreeNode* root = new TreeNode(5);
root->left = new TreeNode(1);
root->right = new TreeNode(5);
root->left->left = new TreeNode(5);
root->left->right = new TreeNode(5);
root->right->right = new TreeNode(5);
Solution a;
std::cout << a.countUnivalSubtrees(root) << "\n";
return 1;
}
边栏推荐
- 第十六章 源代码文件 REST API 教程(一)
- xampp安装包含的组件有(php,perl,apche,mysql)
- 砺夏行动|九州云章津楠:开源不是少数人的运动,大众化才是源泉
- SQL语句的写法:Update、Case、 Select 一起的用法
- 手搓一个“七夕限定”,用3D Engine 5分钟实现烟花绽放效果
- Rust 从入门到精通04-变量
- Theory 1: Deep Learning - Detailed Explanation of the LetNet Model
- 如何才能有效、高效阅读?猿辅导建议“因材因时施教”
- 16、学习MySQL 正则表达式
- 中大型商业银行堡垒机升级改造就用行云管家!必看!
猜你喜欢

MySQL【窗口函数】【共用表表达式】

【北亚数据恢复】IBM System Storage存储lvm信息丢失数据恢复方案

浙江大学团队使用基于知识图谱的新方法,从空间分辨转录组数据中推断细胞间通信状况

Crawler - basic use of selenium, no interface browser, other uses of selenium, cookies of selenium, crawler cases

Google plug-in. Download contents file is automatically deleted after solution

蓝牙技术|上半年全国新增 130 万台充电桩,蓝牙充电桩将成为市场主流

理论篇1:深度学习之----LetNet模型详解

Rust from entry to proficient 04-variables

《中国综合算力指数》《中国算力白皮书》《中国存力白皮书》《中国运力白皮书》在首届算力大会上重磅发出

FRED应用:毛细管电泳系统
随机推荐
技术分享| 小程序实现音视频通话
Sum of four squares, laser bombs
Android Sqlite3基本命令
C# 复制列表
一看就会的Chromedriver(谷歌浏览器驱动)安装教程
OAID是什么
idea去掉spark的日志
企业级优化
C# winforms 输入颜色转换颜色名
FRED应用:毛细管电泳系统
F. Jinyu and its outer matrix (construction)
ACL 2022 | 社会科学理论驱动的言论建模
字符串类的设计与实现_C语言字符串编程题
职场漫谈:为什么越是内卷的行业越有人争着抢着往里冲?好奇怪的说...
word2003按空格键为什么会出现小数点
特殊品种的二次开户验资金额
解题-->在线OJ(十八)
杭电校赛(逆袭指数)
Oracle RAC环境下vip/public/private IP的区别
G. Mountaineering Squad (violence & dfs)