翻转二叉树,感觉做二叉树的问题好像都是那一套公式,除了个别的问题解决不了,用上篇博客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刷题之树(三)相关推荐

  1. LeetCode刷题笔记- 15.三数之和

    LeetCode刷题笔记- 15.三数之和 C语言 题目 注意点 C语言 /*** Return an array of arrays of size *returnSize.* The sizes ...

  2. C#LeetCode刷题-字典树

    字典树篇 # 题名 刷题 通过率 难度 208 实现 Trie (前缀树) 48.6% 中等 211 添加与搜索单词 - 数据结构设计 39.9% 中等 212 单词搜索 II 27.9% 困难 33 ...

  3. C#LeetCode刷题-线段树

    线段树篇 # 题名 刷题 通过率 难度 218 天际线问题 32.7% 困难 307 区域和检索 - 数组可修改 42.3% 中等 315 计算右侧小于当前元素的个数 31.9% 困难 493 翻转对 ...

  4. 【leetcode刷题】21.三数之和——Java版

    ⭐欢迎订阅<leetcode>专栏,每日一题,每天进步⭐ 一题二写,三数之和,题解四瞅五瞄六瞧,水平还七上八下九流,十分辣鸡. --leetcode此题热评 前言 哈喽,大家好,我是一条. ...

  5. leetcode刷题之树(1)

    提到树首先肯定是树的三个遍历即前中后 序遍历.树的遍历可以通过两种方式实现,一种是最常见的最简单递归,一种是借用栈来进行迭代.虽然两者实现的形式不一样,但是两者的思想是一样的.都是有点类似于回溯算法的 ...

  6. Leetcode刷题总结(三)

    1.不用加号的加法 思路:不能用算术运算符,因此考虑位运算来实现加法. class Solution { public:int add(int a, int b) {int sum=0;int car ...

  7. 渣渣的leetcode刷题笔记-树(1)

    这两天在做tree的题目(easy),基本上每道都实现了**recursive**和**iterative**两种解法,简单整理一下. 感想: 能用BFS+queue解决的基本都可以用DFS+stac ...

  8. leetcode刷题之 树(14)-递归:找出二叉树中第二小的节点

    [LeetCode] Second Minimum Node In a Binary Tree 二叉树中第二小的结点 Given a non-empty special binary tree con ...

  9. leetcode刷题之树(2)

    树的层次遍历如果用递归实现的话,则是深度优先搜索,即先遍历到最后最后再回溯,然后看根据在每一层上插入同一层的其它数据.过程 class Solution { public: vector<vec ...

最新文章

  1. firefox input 缓存
  2. Linux进程间通信中的文件和文件锁
  3. 订单自动生成器的算法研究与实现
  4. 【CV论文阅读】 Fast RCNN + SGD笔记
  5. 单片机串行通信全解析
  6. 实验4-2-8 输出整数各位数字 (15 分)
  7. 第一部分----HTML的基本结构与基本标签
  8. 学校计算机联想硬盘保护系统管理员密码,联想硬盘保护系统管理员密码是多少...
  9. SAP软件财务月结之往来重分类
  10. 微软私有云服务器,微软发布私有云解决方案及数据平台
  11. 从RTS游戏看游戏开发
  12. 2003年28家上海最受欢迎的餐馆
  13. 如何将自己做的网页发布到网站让别人可以看到
  14. matlab外推法求区间
  15. yamaha php mt8评测,诶哟这个盒子不错哟,NUC 8i5BEK简单开箱+评测(更新完毕)
  16. 网络io和磁盘io cpu_在Windows 7中使用任务栏仪表监视CPU,内存和磁盘IO
  17. 0011基于单片机电子密码锁控制系统设计
  18. jquery选择器找到含有href属性的所有a标签
  19. 猿创征文|【React 一】 入门学习
  20. KALI LINUX2021环境下使用sqlmap进行DVWA中的sql注入(安全等级LOW)

热门文章

  1. what to do preparing for phd
  2. 亲测有用的markdown博客生成器
  3. 算法之智能搜索(下)
  4. 大系统观:第2章 系统论概述
  5. 前端工程师的知识体系
  6. 解决linux下内网域名的ping结果和nslookup结果不一致
  7. Juniper SRX防火墙系统会话链接的清除
  8. Android Gesture 手势识别使用实例 - Android - mobile - ITeye论坛
  9. CDH4.0安装及配置(二)配置网易yum源
  10. linux 压缩解压归档