当前位置:网站首页>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;
}
边栏推荐
- G. Mountaineering Squad (violence & dfs)
- 两款移相振荡器的对比
- C# 复制列表
- 爬虫——selenium基本使用、无界面浏览器、selenium的其他用法、selenium的cookie、爬虫案例
- Why does the decimal point appear when I press the space bar in word 2003?
- [Problem solving] QT update component appears "To continue this operation, at least one valid and enabled repository is required"
- Chinese valentine's day, of course, to learn SQL optimization better leave work early to find objects
- 物联网应用发展趋势
- 编译型与解释型编程语言的区别
- 浙江大学团队使用基于知识图谱的新方法,从空间分辨转录组数据中推断细胞间通信状况
猜你喜欢
随机推荐
oracle+RAC+linux5.1所需要安装的包
centos7安装mysql急速版
企业级优化
xpath获取带命名空间节点注意事项
用于X射线聚焦的复合折射透镜
蓝牙技术|上半年全国新增 130 万台充电桩,蓝牙充电桩将成为市场主流
【Web技术】1401- 图解 Canvas 入门
1403. 非递增顺序的最小子序列
Oracle RAC环境下vip/public/private IP的区别
电子行业MES管理系统有哪些特殊功能
关于redis的几件小事(五)redis保证高并发以及高可用
Crawler - action chain, xpath, coding platform use
九州云出席领航者线上论坛,共话5G MEC边缘计算现状、挑战和未来
C# 动态加载卸载 DLL
特殊品种的二次开户验资金额
广告电商系统开发功能只订单处理
xampp安装包含的组件有(php,perl,apche,mysql)
Unity插件:使用PopulationSystem制作行走交流的路人
1375. 二进制字符串前缀一致的次数-前序遍历法
快解析结合千方百剂









