提到树首先肯定是树的三个遍历即前中后 序遍历。树的遍历可以通过两种方式实现,一种是最常见的最简单递归,一种是借用栈来进行迭代。虽然两者实现的形式不一样,但是两者的思想是一样的。都是有点类似于回溯算法的思想,拿中序遍历来说,中序遍历的顺序是左根右,无论是栈还是递归我们都先遍历到左子树,当遍历完最深层的左子树之后,开始返回最近的父节点遍历右子树,只不过迭代利用了栈的后进先出的特性,对右子树进行了保存。贴代码

递归实现中序遍历

class Solution {
public:vector<int>res;vector<int> inorderTraversal(TreeNode* root) {if(root) {inorderTraversal(root->left);res.push_back(root->val);inorderTraversal(root->right);}return res;}
};

迭代实现中序遍历

class Solution {
public:vector<int> inorderTraversal(TreeNode* root) {stack<TreeNode*>s;vector<int>res;while(root ||s.size()){while(root){s.push(root);root=root->left;}root=s.top();s.pop();res.push_back(root->val);root=root->right;}return res;}
};

在刷二叉搜索树的时候遇到求不同的二叉搜索树的问题,此问题可以用动态规划解决,也可以利用卡塔兰树解决。

其实我们应该叫明安图数。更便于计算的公式定义如下:

递推公式如下:

1.括号化问题。2.出栈次序问题。3.将多边行划分为三角形问题。

2012腾讯实习招聘笔试题
在图书馆一共6个人在排队,3个还《面试宝典》一书,3个在借《面试宝典》一书,图书馆此时没有了面试宝典了,确保三个人都能借到书,求他们排队的总数?

阿里巴巴的笔试题目:说16个人按顺序去买烧饼,其中8个人每人身上只有一张5块钱,另外8个人每人身上只有一张10块钱。烧饼5块一个,开始时烧饼店老板身上没有钱。16个顾客互相不通气,每人只买一个。问这16个人共有多少种排列方法能避免找不开钱的情况出现。

动态规划题解方法根据上边介绍的递推公式写出。

class Solution {
public:int numTrees(int n) {vector<int> g(n+1);g[1]=1;g[0]=1;for(int i=2;i<=n;i++){for(int j=1;j<=i;j++)g[i]+=g[j-1]*g[i-j];}return g[n];}
};

明安图解决

class Solution {
public:int numTrees(int n) {long c = 1;for(int i = 0; i < n; i++)c = c * 2 * (2 * i  + 1) /(i + 2);return c;}
};

知道了中序遍历这道题就可以直接利用迭代的方法秒杀。

这道题是让我们去验证父节点是否大于左子结点(a),且小于右子结点(b)。我们肯定是需要遍历这棵树的,中序遍历是先遍历到最深层的左叶子结点,然后就去遍历父节点,这个时候我们要 判断a只需将正在遍历的叶子结点用tmp保存,然后看是否大于等于父节点即可,大于就是返回错误,然后再返回去遍历最近的右子结点,注意这个时候tmp保存的是父节点,所以还是判断tmp是否大于等于右子节点(root->val)。就是tmp始终保存的是上一轮的值,然后拿着tmp和当前的root去比较。代码如下:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:bool isValidBST(TreeNode* root) {long tmp=LONG_MIN;stack<TreeNode*>s;while(root ||s.size()!=0 ){while(root){s.push(root);root=root->left;}root=s.top();s.pop();if(tmp>=root->val)return false;tmp=root->val;root=root->right;}return true;}
};

虽然标记的 这是一道简单的题目,但是我一开始也没有想出来,看是否对称只需要看左子树的左结点和右子树的右结点是否相等,左子树的右结点和右子树的左结点是否相等。

递归代码如下

class Solution {
public:bool isSymmetric(TreeNode* root) {return helper(root,root);}bool helper(TreeNode* t1,TreeNode* t2){if(!t1 && !t2) return true;if(!t1 || !t2) return false;return (t1->val==t2->val)&& helper(t1->left,t2->right) && helper(t1->right,t2->left);}
};

其实通过队列或者栈去迭代思想是一样的

class Solution {
public:bool isSymmetric(TreeNode* root) {if(root==NULL) return true;stack<TreeNode*> s;s.push(root->left);s.push(root->right);while(s.size()){TreeNode* t1=s.top();s.pop();TreeNode* t2=s.top();s.pop();if(!t1 && !t2) continue;if(!t1 || !t2) return false;if(t1->val!=t2->val) return false;s.push(t1->left);s.push(t2->right);s.push(t1->right);s.push(t2->left);}return true;}
};

leetcode刷题之树(1)相关推荐

  1. leetcode刷题之树(三)

    翻转二叉树,感觉做二叉树的问题好像都是那一套公式,除了个别的问题解决不了,用上篇博客leetcode刷题之树(二)的模型基本可以解决.总体来说就是树基本都可以利用递归和迭代的方法去解决,在涉及到树的遍 ...

  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刷题笔记-树(1)

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

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

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

  6. leetcode刷题之树(2)

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

  7. 【每日一题】Leetcode 刷题 二叉树-树的遍历 介绍

    二叉树-树的遍历 前序遍历 (根 左 右) 中序遍历 (左 根 右) 后序遍历 (左 右 根) 代码实现 前序遍历 中序遍历 后序遍历 完整代码 前序遍历 (根 左 右) 遍历顺序分别为: F B A ...

  8. C#LeetCode刷题-树

    树篇 # 题名 刷题 通过率 难度 94 二叉树的中序遍历 61.6% 中等 95 不同的二叉搜索树 II 43.4% 中等 96 不同的二叉搜索树 51.6% 中等 98 验证二叉搜索树 22.2% ...

  9. C#LeetCode刷题,走进Google,走近人生

    该文章的最新版本已迁移至个人博客[比特飞],单击链接 C#LeetCode刷题,走进Google,走近人生 | .Net中文网 访问. 概述 本系列博文将会向大家介绍本人在钻研<算法导论 第3版 ...

最新文章

  1. 再谈JSON -json定义及数据类型
  2. java string 异或_Java源码——String
  3. tp5 分页php不能foreach,tp5框架无刷新分页实现方法分析
  4. solr java score_java-Apache Solr:按位运算来过滤搜索结果
  5. 基于谷歌街景多位数字识别技术:TensorFlow的车牌号识别系统
  6. 40个前端新手入门练习项目,学完即可做项目
  7. ds90ub934 i2c 配置_TI ds90ub954 芯片调试简单总结
  8. 详谈概率图模型(PGM)
  9. Qt:20---Containers控件的使用
  10. Kaggle-泰坦尼克号-机器学习/数据挖掘学习笔记
  11. lftp命令使用 操作系统(Windows、Linux) PHP学会网 php培训网 PHP暑期培训 PHP寒假培训 PHP假期培训 - powered by phpwhy.com
  12. 图片缩放库 Photoview 和 Gif 控件 GifView 的使用
  13. 提升团队战斗力的要点
  14. IT培训机构那些让人恶心的招生手法
  15. 干起了人人字幕组的翻译工作-贡献开源代码
  16. win10系统VMware虚拟机安装linux使用NAT模式上网配置-命令行上网
  17. web服务器的开发(简易版本)
  18. 宽带连接连接被远程计算机终止win10,Win10宽带无法连接提示“调制解调器报告了一个错误”怎么解决?...
  19. 如何打开Mysql数据库文件
  20. 加入键盘鼠标控制的代码

热门文章

  1. 关于STRONG NAME
  2. 如果你有15M 你会投到那些项目上上面呢?机会-可行性模型帮助你
  3. 做事情不要着急,着急只能把事情做的更加糟糕。。。
  4. pycharm和vs code的使用体验
  5. 每天只能发十篇文章的限制引发的连锁反应
  6. LUA 利用#遍历表的问题
  7. map的用法-HD 1029Ignatius and the Princess IV
  8. (十二)java版电子商务spring cloud分布式微服务- Spring 4.2.2以上版本和swagger集成方案和踩过的坑...
  9. 2018年香港私隐公署接129宗资料外泄通报 创新高
  10. Mongodb数据查询 | Mongodb