Leetcode题解(33)
113. Path Sum II
题目

分析:
主要考察二叉树深度优先遍历(DFS),递归调用当前节点的左右结点即可,代码如下(copy网上):
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
private:
vector<vector<int> > ret;
public:
void dfs(TreeNode *node, int sum, int curSum, vector<int> a)
{
if (node == NULL)
return; if (node->left == NULL && node->right == NULL)
{
if (curSum + node->val == sum)
{
a.push_back(node->val);
ret.push_back(a);
}
return;
} a.push_back(node->val);
dfs(node->left, sum, curSum + node->val, a);
dfs(node->right, sum, curSum + node->val, a);
} vector<vector<int> > pathSum(TreeNode *root, int sum) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
ret.clear();
vector<int> a;
dfs(root, sum, , a);
return ret;
}
};
上面的方法中,采用了递归,代码简单也利于理解,如果要是不采用递归该怎么求解呢?
如果不采用递归,就需要在迭代过程中“回溯”,也就需要保存当前节点左右子节点是否已经遍历过,如果没有遍历,则继续往下遍历,如果都遍历过了,则往其父节点回溯
代码如下:
/**
* 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:
vector<vector<int>> pathSum(TreeNode* root, int sum) {
vector<vector<int>> res;
vector<int> temp;
vector<TreeNode*> myStack;//用vector模拟stack
stack<bool> isVisitedLeft;//记录左节点是否访问过
stack<bool> isVisitedRight;//记录右节点是否访问过
TreeNode *top;
int index;
int count=;
if(NULL == root)
return res;
if(root->left == NULL && root->right == NULL)
{
if(root->val == sum)
{
temp.push_back(root->val);
res.push_back(temp);
} return res;
}
myStack.resize();
myStack[] = root;
isVisitedLeft.push(false);
isVisitedRight.push(false);
index=;
count += root->val;
while(index>=)
{
top = myStack[index];
if(!(isVisitedLeft.top()))//左节点没有被访问
{
isVisitedLeft.pop();
isVisitedLeft.push(true);
if(top->left != NULL)
{
myStack[index+]= top->left;//插入左节点
isVisitedLeft.push(false);//该节点左右节点都没被访问过
isVisitedRight.push(false);
index++;
count+=top->left->val;
} }
else if(!(isVisitedRight.top()))
{
isVisitedRight.pop();
isVisitedRight.push(true);
if(top->right != NULL)
{
myStack[index+]= top->right;
isVisitedLeft.push(false);//该节点左右节点都没被访问过
isVisitedRight.push(false);
index++;
count+=top->right->val;
} }
else
{
if(count == sum && top->left == NULL && top->right == NULL)
{
temp.clear();
//for(int i=0;i<myStack.size();i++)不能这样写
for(int i=;i<=index;i++)
{
temp.push_back(myStack[i]->val);//这里就知道为啥用vector模拟stack,主要是为了遍历方便,也可以用stack,只不过遍历stack需要逐个出栈
}
res.push_back(temp);
} count -=top->val;
index--;
isVisitedLeft.pop();
isVisitedRight.pop(); }
}
return res;
}
};
--------------------------------------------------------------------------------分割线--------------------------------------------------------------------------------
114. Flatten Binary Tree to Linked List
题目

分析:
根据题目的例子可以发现,最终得到的结果其实是二叉树前序遍历得到的序列顺序。因此可以仿照前序遍历的递归思想进行操作,代码如下:
代码中有一个lastNode 指针,用于指向当前链表的最后一个节点。
/**
* 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:
TreeNode* lastNode;
void flatten(TreeNode* root) {
if(NULL == root)
return;
lastNode = root;
preOrder(root);
}
void preOrder(TreeNode* root)
{
if(root== NULL)
{
return ;
}
TreeNode *temp=NULL;
lastNode = root;
temp = root->right;//切断右子树,用temp指向右子树
root->right = root->left;
root->left = NULL;
preOrder(root->right);
lastNode->right = temp;//右子树的所有节点是lastNode节点之后的
preOrder(temp);
}
};
如果采用非递归的,则需要一个stack,但是不符合题目要求:在本地处理节点(in-place)。
Leetcode题解(33)的更多相关文章
- LeetCode题解33.Search in Rotated Sorted Array
33. Search in Rotated Sorted Array Suppose an array sorted in ascending order is rotated at some piv ...
- [LeetCode 题解]: ZigZag Conversion
前言 [LeetCode 题解]系列传送门: http://www.cnblogs.com/double-win/category/573499.html 1.题目描述 The string ...
- 【LeetCode题解】二叉树的遍历
我准备开始一个新系列[LeetCode题解],用来记录刷LeetCode题,顺便复习一下数据结构与算法. 1. 二叉树 二叉树(binary tree)是一种极为普遍的数据结构,树的每一个节点最多只有 ...
- leetcode题解-122买卖股票的最佳时期
题目 leetcode题解-122.买卖股票的最佳时机:https://www.yanbinghu.com/2019/03/14/30893.html 题目详情 给定一个数组,它的第 i 个元素是一支 ...
- 【LeetCode题解】3_无重复字符的最长子串(Longest-Substring-Without-Repeating-Characters)
目录 描述 解法一:暴力枚举法(Time Limit Exceeded) 思路 Java 实现 Python 实现 复杂度分析 解法二:滑动窗口(双指针) 思路 Java 实现 Python 实现 复 ...
- 【LeetCode题解】225_用队列实现栈(Implement-Stack-using-Queues)
目录 描述 解法一:双队列,入快出慢 思路 入栈(push) 出栈(pop) 查看栈顶元素(peek) 是否为空(empty) Java 实现 Python 实现 解法二:双队列,入慢出快 思路 入栈 ...
- 【LeetCode题解】232_用栈实现队列(Implement-Queue-using-Stacks)
目录 描述 解法一:在一个栈中维持所有元素的出队顺序 思路 入队(push) 出队(pop) 查看队首(peek) 是否为空(empty) Java 实现 Python 实现 解法二:一个栈入,一个栈 ...
- 【LeetCode题解】844_比较含退格的字符串(Backspace-String-Compare)
目录 描述 解法一:字符串比较 思路 Java 实现 Python 实现 复杂度分析 解法二:双指针(推荐) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记可以 ...
- 【LeetCode题解】25_k个一组翻转链表(Reverse-Nodes-in-k-Group)
目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记 ...
- 【LeetCode题解】24_两两交换链表中的节点(Swap-Nodes-in-Pairs)
目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度要求) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解 ...
随机推荐
- AngularJS--控制器(Controller)
点击查看AngularJS系列目录 转载请注明出处:http://www.cnblogs.com/leosx/ 理解控制器 在AngularJS的控制器中,构造函数会有Scope参数. 当一个控制器通 ...
- Maven在Windows中的配置以及IDE中的项目创建
Maven在Windows下的配置 1.Maven下载地址:http://maven.apache.org/download.cgi,下载红框里的版本即可. 2.解压到D盘: 3.修改配置文件sett ...
- JAVA 局部变量表
1. 除了 long,double 占用两个slot 之外,其他类型均占用一个slot. 2.在内容相同的情况下, 实例方法(不加 static) 会比 类方法 (static)对占用一个局部变量位置 ...
- Power Sum 竟然用原根来求
Power Sum Time Limit: 20000/10000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) SubmitS ...
- NDK各个版本链接
ndk_r15c (July 2017) Windows 32-bit : https://dl.google.com/android/repository/android-ndk-r15c-wind ...
- JS方法总结
1.普通的方法定义 function(){ } 2.变量方法定义 var text=function(){ } 3.对象方法定义 text:function(){ } 4.ES6 text(x=0,y ...
- httpd日志和日志轮替工具
html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...
- PIC24 通过USB在线升级 -- USB HID bootloader
了解bootloader的实现,请加QQ: 1273623966 (验证填bootloader):欢迎咨询或定制bootloader; 我的博客主页www.cnblogs.com/geekygeek ...
- Django进阶篇【1】
注:本篇是Django进阶篇章,适合人群:有Django基础,关于Django基础篇,将在下一章节中补充! 首先我们一起了解下Django整个请求生命周期: Django 请求流程,生命周期: 路由部 ...
- Java web JavaScript DOM 编程
JavaScript DOM 编程 (1).DOM概述及分类 (2).DOM结构模型:XML DOM 和 HTML DOM 关系? (3).结点,结点树,结点属性与方法? 1.DOM是什么? d ...