当前位置: 首页 > news >正文

力扣1457. 二叉树中的伪回文路径

在这里插入图片描述
在这里插入图片描述
这一题就是正常的dfs,在遍历的过程中把所有的从根到叶子节点给放进数组里,然后判断它是不是一个伪回文串,如果是则ans++,
那么如何判断是不是一个伪回文串,回文串是具有奇偶性质的,之前的题目也遇到过
,我们可以分奇偶,奇数个的回文串我们只需要保证最多有一个数字出现奇数次,偶数个回文串,我们需要保证每一个数字都出现偶数次即可。
带着这样的思路我开始了写代码。

/*** 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:vector<int> cnt;int ans;unordered_map<int,int> mp;// unordered_map<int,int> mp;bool ishuiwen(vector<int>& cnt){if(cnt.size()==1){return true;}else{if(cnt.size()%2==0){mp.clear();for(int i=0;i<cnt.size();i++){mp[cnt[i]]++;}for(auto it: mp){if(it.second%2==0){}else{return false;}}return true;}else{mp.clear();for(int i=0;i<cnt.size();i++){mp[cnt[i]]++;}int flag=0;for(auto it: mp){if(it.second%2==0){}else {if(flag==1){return false;}else{flag++;}}}return true;}}}void dfs(TreeNode* root,vector<int>&cnt){if(root==nullptr){return ;}else{cnt.push_back(root->val);if(root->left==nullptr&&root->right==nullptr){//说明构成了一个序列了,我们只需要判断它是不是回文序列//判断一个序列是不是回文序列  if(ishuiwen(cnt)){ans++;}cnt.pop_back();return;                   }// cnt.push_back(root->val);dfs(root->left,cnt);dfs(root->right,cnt);cnt.pop_back(); }}int pseudoPalindromicPaths (TreeNode* root) {if(root==nullptr){return 0;}dfs(root,cnt);return ans;}
};

在获得一个伪回文串后,就用哈希表保存它中的所有元素,然后再按照上面我提到的判断方法判断,可以得到正确答案,**我们要注意访问过的序列,在dfs回溯的过程中也需要让它弹出序列。**我的这种思路虽然是对的,但是时间复杂度太高了,因为我是在得到序列后再放入哈希表,再判断,dfs得到序列的过程就已经O(n),后面在放哈希表再判断就O(n^2)根据数据范围,是超出时间限制的。
因此,我们应该在dfs访问和回溯的过程中,放入哈希表,当得到序列的时候,直接判断是不是回文串就可以。

/*** 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:vector<int> cnt;int ans;int f[10];void dfs(TreeNode* root,vector<int>&cnt){if(root==nullptr){return ;}else{cnt.push_back(root->val);f[root->val]++;if(root->left==nullptr&&root->right==nullptr){if(cnt.size()==1){ans++;}else{if(cnt.size()%2==0){bool isflag=0;for(int i=1;i<=9;i++){if(f[i]%2==0){}else{isflag=1;}}if(isflag==0){ans++;}}else{int flag=0;for(int i=1;i<=9;i++){if(f[i]%2==0){}else{flag++;}}if(flag<=1){ans++;}}}//说明构成了一个序列了,我们只需要判断它是不是回文序列cnt.pop_back(); f[root->val]--;return ;}dfs(root->left,cnt); dfs(root->right,cnt);cnt.pop_back(); f[root->val]--;}}int pseudoPalindromicPaths (TreeNode* root) {if(root==nullptr){return 0;}dfs(root,cnt);return ans;}
};
···
我这里的vector<int> cnt,实际上是多余了,可以去掉的。
**注意理解回溯和递归是解决这一题的关键。**
时间复杂度O(n),因为根据题目上的数据范围,判断回文串是常数级
http://www.lryc.cn/news/602063.html

相关文章:

  • 力扣面试150(42/150)
  • 旧物回收小程序:科技赋能,让旧物回收焕发生机
  • 软件测试之功能测试
  • 6种将iPhone照片传输到Windows 10电脑的方法
  • 跨境协作系统文化适配:多语言环境下的业务符号隐喻与交互习惯
  • 快速了解MySQL
  • Ubuntu lamp
  • 分布式IO选型指南:2025年分布式无线远程IO品牌及采集控制方案详解
  • 四、计算机组成原理——第3章:存储系统
  • 低速信号设计之 SMBUS 篇
  • Power Query概述及导入多源数据方法
  • 从fork到exit:剖析Linux进程的诞生、消亡机制
  • C盘清理大赛技术指南
  • 凸优化:凸函数的一些常用性质
  • 动/静态库的原理及制作
  • 开源B端生态掘金:从Odoo二次开发到行业专属模块的技术变现
  • Qwen 系列模型实现文本改写工具
  • Java 大视界 -- 基于 Java 的大数据实时流处理在智能电网分布式能源接入与电网稳定性保障中的应用(368)
  • Java从入门到精通!第十八天(JDK17安装以及网络编程) 完结篇!!!
  • WPF,窗口拖动事件与窗口内控件点击事件
  • Visual Studio Code使用
  • MCP资源管理深度实践:动态数据源集成方案
  • Jenkins vs GitLab CI/CD vs GitHub Actions在容器化部署流水线中的对比分析与实践指南
  • Spring Boot 2整合Druid的两种方式
  • Spring Boot日志开发实战手册:集成/输出/级别控制/持久化精要
  • docker排查OOM
  • c++ 中的字符串相关的操作
  • 「源力觉醒 创作者计划」_文心大模型4.5系列开源模型,意味着什么?对开发者、对行业生态有何影响?
  • 重复文件清理工具,附免费链接
  • 聊聊工业相机中的硬触发、软触发和视频流模式