Recursive - leetcode [递归]
经验tips:
Recursion is the best friend of tree-related problems.
一是只要遇到字符串的子序列或配准问题首先考虑动态规划DP,二是只要遇到需要求出所有可能情况首先考虑用递归。
93 - restore IP address
注:
A。在return条件之前先判断valid的条件 1, max bits per partition[size() - startIndex <= (4 - parts) * 3] 2, min bit per partiton[1].否则在1111 的情况会重复输出level直接被push进result里。
B。recursive语句在for循环的if的判断语句里。
95 - unique binary search tree II
对于第i个node generate from 1~i - 1 给左子树 i+1~n右子树。
三层循环: 第i个node vector<TreeNode*> left left[j] right[k] 最里层循环new节点i 赋值i, i->left, i->right。然后push进vector tree里。最后return tree。
循环前加判断条件:当start > end 直接push NULL 然后return tree。
98. Validate Binary Search Tree
空树为真。
中序遍历,用lastnode记录并比较 如果大于当前node的val就return false。
判断条件:
A。if(!isValid(root ->left)) return false
B。if(!lastnode && lastnode->val>=root->val) return false =====> lastnode往下走 = root
C。return isValid(root -> right)
100. Same Tree
对每一个点的判断条件有三个:
A。同时为空 真
B。不同时为空 假
C。值不同 假
return isSame(p->left,q->left)&&isSame(p->right,q->right);
101. Symmetric Tree
判断方法与same tree 基本相同 最后recursive的时候左右树的左右子树对称比较。
104. Maximum Depth of Binary Tree
最底层:root == NULL时 return 0;
每一层会加一:return (l > r) ? l + 1 : r + 1;
int l = maxDepth(root -> left);
105. Construct Binary Tree from Preorder and Inorder Traversal
preorder第一个是root。在inorder中找root,然后分别generate左右子树。
typedef vector<int>::iterator Iter;
开始要判断是否为空树。
106. Construct Binary Tree from Inorder and Postorder Traversal
postorder最后一个是root。
108. Convert Sorted Array to Binary Search Tree
找median。先new root,左右分别recursive调用generate左右子树。
109. Convert Sorted List to Binary Search Tree
中序遍历。先generate左子树用变量存起来,再连接到root上,再root->right = generate(list,mid,end);
要先过一遍list求size。
110. Balanced Binary Tree
Maximum depth of binary tree的变形。
A。空树 return 0
B。不符合判断 return -1
C。依然return (l > r) ? l + 1:r+1。返回depth
主程序判断:只要返回值为-1就return false
111. Minimum Depth of Binary Tree
最底层:return条件:为空,返回0;为叶子节点,返回1。
与max depth不同的地方是return条件 +1换地方了。
最后return min(l,r)的时候别忘了加根。+ 1
112. Path Sum
return的是布尔值。
bool helper(TreeNode* root, int sum, int val){
if(root == NULL) return false;
val += root -> val;//语句顺序!!!!!
if(val == sum && !root -> left && !root -> right){
return true;
}
//val += root -> val;
return helper(root -> left, sum, val)||helper(root -> right, sum, val);
}
113. Path Sum II
return为空。
每一层level pop的时候是在dfs完左右子树的时候。
result.push_back(level)的条件成立时 并不返回。原因是如果不在遍历完左右子树的时候返回,level里面的值会多出。
void dfs(TreeNode* root, int sum, vector<vector<int>>& result, vector<int>& level, int val){
if(root == NULL) return;
level.push_back(root -> val);//注意:对称结构在最外层!!!!!
val += root -> val;
if(val == sum && !root -> left && !root -> right){
result.push_back(level);
//return;
}
//while(root){
else{
if(root -> left){
//level.push_back(root -> left -> val);
dfs(root -> left, sum, result, level, val);
//level.pop_back();
}
if(root -> right){
//level.push_back(root -> right -> val);
dfs(root -> right, sum, result, level, val);
//level.pop_back();
}
}
level.pop_back();
val -= root -> val;
return;////为啥在此处return啊!!!????
}
12/15/16
124. Binary Tree Maximum Path Sum
注:传的是节点的值 不是高度 最后return max(left, right) + root -> val;
但主程序返回的并不是recursion的值 而是全局变量ans
12/17/16
Recursion. Similar as [LeetCode] Binary Tree Maximum Path Sum Solution, the difference here is only adding a track variable to sum all the paths.
void generate(TreeNode* root, int sum, int path){
if(root == NULL) return;
path = path * 10 + root -> val;
if(root -> left == NULL && root -> right == NULL){
sum += path;
return;
}
generate(root -> left, sum, path);
generate(root -> right, sum, path);
}
12/19/16
133. Clone Graph
注意:别忘了初始化table!!!!
table[newnode -> label] = newnode;
Recursive - leetcode [递归]的更多相关文章
- LeetCode 递归(Recursion) 培训专题 讲解文章翻译 (附链接)
递归 - 时间复杂度 在本文中, 我们主要介绍如何分析递归算法程序中的时间复杂度.. 在一个递归程序中, 它的时间复杂度 O(T) 一般来说就是他总共递归调用的次数 (定义为 R) 以及每次调用时所 ...
- LeetCode递归解题模板
39 40 78. Subsets https://leetcode.com/problems/subsets/description/ void subsets(vector<int>& ...
- React-router4 第七篇 Recursive Paths 递归路径
https://reacttraining.com/react-router/web/example/recursive-paths import React from 'react' import ...
- LeetCode递归 -2(Recursion) 培训专题 讲解文章翻译 (附链接) (2019-04-09 15:50)
递归 - 空间复杂度 在本文中, 我们将讨论如何分析递归算法的空间复杂度. 在计算递归算法的空间复杂度时,最需要考虑的两个部分就是: 递归相关空间 (recursion related space) ...
- LeetCode || 递归 / 回溯
呜呜呜 递归好不想写qwq 求“所有情况”这种就递归 17. Letter Combinations of a Phone Number 题意:在九宫格上按数字,输出所有可能的字母组合 Input: ...
- [03] Recursive Function递归应用
递归应用 1.理解 百科:一种计算过程,如果其中每一步都要用到前一步或前几步的结果,称为递归的: 理解:函数调用自己的过程,这类函数处理的事情具有重复性,处理此类实行可用while或者for,但结构上 ...
- Leetcode 递归题
24. 两两交换链表中的节点 题目描述: 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2-&g ...
- [leetcode] 94. Binary Tree Inorder Traversal 二叉树的中序遍历
题目大意 https://leetcode.com/problems/binary-tree-inorder-traversal/description/ 94. Binary Tree Inorde ...
- wget 递归下载整个网站
wget -r -p -np -k http://xxx.com/xxx -r, --recursive(递归) specify recursive download.(指定递归下 ...
随机推荐
- jQuery判断元素是否显示与隐藏
jQuery判断一个元素是显示还是隐藏,jQuery使用is()方法来判断一个元素是否显示,反之则为隐藏 核心代码 if($("#username").is(":hidd ...
- 通过Thrift访问HDFS分布式文件系统的性能瓶颈分析
通过Thrift访问HDFS分布式文件系统的性能瓶颈分析 引言 Hadoop提供的HDFS布式文件存储系统,提供了基于thrift的客户端访问支持,但是因为Thrift自身的访问特点,在高并发的访问情 ...
- LigerUI权限系统之菜单管理
菜单管理跟上篇的组织结构实现方式差不多,所以不存在多大的问题.还是老样,先上图,再看代码.菜单管理界面 菜单管理添加: 菜单管理修改: 前端完整代码: @section headerScripts{ ...
- 微软IE11浏览器的7大变化
微软IE11浏览器的7大变化 投递人 itwriter 发布于 2013-06-29 11:48 评论(9) 有1025人阅读 原文链接 [收藏] « » 微软很看重自己的 IE 浏览器,这款浏 ...
- Java远程调用邮件服务器,实现邮件发送
写这篇文章的背景是公司Android客户端需要实现一个功能,实现类似于密码找回或者用户注册完发送一个邮件给用户的功能,当然这些逻辑客户端只负责请求自己的服务端,自己的服务端再去请求邮件服务器. 邮件服 ...
- 黑马程序员:Java基础总结----GUI图形化界面
黑马程序员:Java基础总结 GUI图形化界面 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! GUI(Graphical User Interface)图形化界 ...
- oracle保证读一致性原理
35 这里也有讲解 1:undo segment的概念 当数据库进行修改的时候,需要把保存到以前的old的数据保存到一个地方,然后进行修改,用于保存old数据的segment 就是undo segme ...
- .Net程序员学用Oracle系列(9):系统函数(上)
<.Net程序员学用Oracle系列:导航目录> 本文大纲 1.字符函数 1.1.字符函数简介 1.2.语法说明及案例 2.数字函数 2.1.数字函数简介 2.2.语法说明及案例 3.日期 ...
- 算法笔记_015:快速排序(Java)
目录 1 问题描述 2 解决方案 2.1 快速排序原理简介 2.2 具体编码 1 问题描述 给定一组数据,使用快速排序得到这组数据的非降序排列. 2 解决方案 2.1 快速排序原理简介 引用自百度百科 ...
- JMeter在Linux系统中的环境变量配置
下载: 在线下载jmeter(或者本地上传): wget http://mirrors.tuna.tsinghua.edu.cn/apache//jmeter/binaries/apache-jmet ...