leetcode刷题之树(三)
翻转二叉树,感觉做二叉树的问题好像都是那一套公式,除了个别的问题解决不了,用上篇博客leetcode刷题之树(二)的模型基本可以解决。总体来说就是树基本都可以利用递归和迭代的方法去解决,在涉及到树的遍历的时候偏向于利用栈来存储数据,在求和树的层次相关的问题时偏向于利用队列来存储数据。 个人感觉迭代更好理解,因为递归涉及回溯
class Solution {
public:TreeNode* invertTree(TreeNode* root) {queue<TreeNode*>s;s.push(root);if(root==NULL)return root;while(!s.empty()){ TreeNode*h=s.front();TreeNode* temp=NULL;temp=h->left;h->left=h->right;h->right=temp;s.pop();if(h->left!=NULL)s.push(h->left);if(h->right!=NULL)s.push(h->right); }return root;}
};
递归解决代码较少,理解起来不如用队列。
class Solution {
public:TreeNode* invertTree(TreeNode* root) {if(root==NULL)return root;TreeNode* temp;temp=root->left;root->left=invertTree(root->right);root->right=invertTree(temp);return root;}
};
这道题我按照官方思路,写成c++的形式,应该是哈希表定义的不对,老提示我有错误,说stl库里没有insert这个函数,以后再解决。
class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {queue<TreeNode*> s;unordered_map<TreeNode*,TreeNode*> parent;parent.insert(root,NULL);s.push(root);while(!parent.find(p) ||!parent.find(q)){TreeNode* node=s.top();s.pop();if(node->left!=NULL){parent.insert(node->left,node);s.push(node->left);}if(node->right!=NULL){parent.insert(node->right,node);s.push(node->right);}}set<TreeNode*>ancestors;while (p!=NULL){ancestors.insert(p);p=parent.find(p);}while(!ancestors.find(q))q=parent.find(q);return q; }
};
这个题比较抽象想到了就很好解决,属于树得动态规划问题。
class Solution {
public:pair<int, int> dfs(TreeNode *root) {if (root == nullptr) {return { 0, 0 };}auto left_pair = dfs(root->left);auto right_pair = dfs(root->right);return { root->val + left_pair.second + right_pair.second, max(left_pair.first, left_pair.second) + max(right_pair.first, right_pair.second) };}int rob(TreeNode* root) {auto p = dfs(root);return max(p.first, p.second);}
};
//(1)当前结点选择偷+左右孩子不偷能拿出的钱
//(2)当前结点不偷即求左右孩子最多能偷到的钱
leetcode刷题之树(三)相关推荐
- LeetCode刷题笔记- 15.三数之和
LeetCode刷题笔记- 15.三数之和 C语言 题目 注意点 C语言 /*** Return an array of arrays of size *returnSize.* The sizes ...
- C#LeetCode刷题-字典树
字典树篇 # 题名 刷题 通过率 难度 208 实现 Trie (前缀树) 48.6% 中等 211 添加与搜索单词 - 数据结构设计 39.9% 中等 212 单词搜索 II 27.9% 困难 33 ...
- C#LeetCode刷题-线段树
线段树篇 # 题名 刷题 通过率 难度 218 天际线问题 32.7% 困难 307 区域和检索 - 数组可修改 42.3% 中等 315 计算右侧小于当前元素的个数 31.9% 困难 493 翻转对 ...
- 【leetcode刷题】21.三数之和——Java版
⭐欢迎订阅<leetcode>专栏,每日一题,每天进步⭐ 一题二写,三数之和,题解四瞅五瞄六瞧,水平还七上八下九流,十分辣鸡. --leetcode此题热评 前言 哈喽,大家好,我是一条. ...
- leetcode刷题之树(1)
提到树首先肯定是树的三个遍历即前中后 序遍历.树的遍历可以通过两种方式实现,一种是最常见的最简单递归,一种是借用栈来进行迭代.虽然两者实现的形式不一样,但是两者的思想是一样的.都是有点类似于回溯算法的 ...
- Leetcode刷题总结(三)
1.不用加号的加法 思路:不能用算术运算符,因此考虑位运算来实现加法. class Solution { public:int add(int a, int b) {int sum=0;int car ...
- 渣渣的leetcode刷题笔记-树(1)
这两天在做tree的题目(easy),基本上每道都实现了**recursive**和**iterative**两种解法,简单整理一下. 感想: 能用BFS+queue解决的基本都可以用DFS+stac ...
- leetcode刷题之 树(14)-递归:找出二叉树中第二小的节点
[LeetCode] Second Minimum Node In a Binary Tree 二叉树中第二小的结点 Given a non-empty special binary tree con ...
- leetcode刷题之树(2)
树的层次遍历如果用递归实现的话,则是深度优先搜索,即先遍历到最后最后再回溯,然后看根据在每一层上插入同一层的其它数据.过程 class Solution { public: vector<vec ...
最新文章
- firefox input 缓存
- Linux进程间通信中的文件和文件锁
- 订单自动生成器的算法研究与实现
- 【CV论文阅读】 Fast RCNN + SGD笔记
- 单片机串行通信全解析
- 实验4-2-8 输出整数各位数字 (15 分)
- 第一部分----HTML的基本结构与基本标签
- 学校计算机联想硬盘保护系统管理员密码,联想硬盘保护系统管理员密码是多少...
- SAP软件财务月结之往来重分类
- 微软私有云服务器,微软发布私有云解决方案及数据平台
- 从RTS游戏看游戏开发
- 2003年28家上海最受欢迎的餐馆
- 如何将自己做的网页发布到网站让别人可以看到
- matlab外推法求区间
- yamaha php mt8评测,诶哟这个盒子不错哟,NUC 8i5BEK简单开箱+评测(更新完毕)
- 网络io和磁盘io cpu_在Windows 7中使用任务栏仪表监视CPU,内存和磁盘IO
- 0011基于单片机电子密码锁控制系统设计
- jquery选择器找到含有href属性的所有a标签
- 猿创征文|【React 一】 入门学习
- KALI LINUX2021环境下使用sqlmap进行DVWA中的sql注入(安全等级LOW)