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)的更多相关文章

  1. 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 ...

  2. [LeetCode 题解]: ZigZag Conversion

    前言   [LeetCode 题解]系列传送门:  http://www.cnblogs.com/double-win/category/573499.html   1.题目描述 The string ...

  3. 【LeetCode题解】二叉树的遍历

    我准备开始一个新系列[LeetCode题解],用来记录刷LeetCode题,顺便复习一下数据结构与算法. 1. 二叉树 二叉树(binary tree)是一种极为普遍的数据结构,树的每一个节点最多只有 ...

  4. leetcode题解-122买卖股票的最佳时期

    题目 leetcode题解-122.买卖股票的最佳时机:https://www.yanbinghu.com/2019/03/14/30893.html 题目详情 给定一个数组,它的第 i 个元素是一支 ...

  5. 【LeetCode题解】3_无重复字符的最长子串(Longest-Substring-Without-Repeating-Characters)

    目录 描述 解法一:暴力枚举法(Time Limit Exceeded) 思路 Java 实现 Python 实现 复杂度分析 解法二:滑动窗口(双指针) 思路 Java 实现 Python 实现 复 ...

  6. 【LeetCode题解】225_用队列实现栈(Implement-Stack-using-Queues)

    目录 描述 解法一:双队列,入快出慢 思路 入栈(push) 出栈(pop) 查看栈顶元素(peek) 是否为空(empty) Java 实现 Python 实现 解法二:双队列,入慢出快 思路 入栈 ...

  7. 【LeetCode题解】232_用栈实现队列(Implement-Queue-using-Stacks)

    目录 描述 解法一:在一个栈中维持所有元素的出队顺序 思路 入队(push) 出队(pop) 查看队首(peek) 是否为空(empty) Java 实现 Python 实现 解法二:一个栈入,一个栈 ...

  8. 【LeetCode题解】844_比较含退格的字符串(Backspace-String-Compare)

    目录 描述 解法一:字符串比较 思路 Java 实现 Python 实现 复杂度分析 解法二:双指针(推荐) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记可以 ...

  9. 【LeetCode题解】25_k个一组翻转链表(Reverse-Nodes-in-k-Group)

    目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记 ...

  10. 【LeetCode题解】24_两两交换链表中的节点(Swap-Nodes-in-Pairs)

    目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度要求) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解 ...

随机推荐

  1. 三大修饰符static,final,abstract,接口和抽象类的区别

    package com.cityhero.test; public class ThreeModifier { //static静态的 // 概念:static可以修饰方法和属性,被static修的方 ...

  2. LINUX通过PXE自动部署系统

    原理介绍 TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP 协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂.开销不大的 ...

  3. Spring 3.x 读书笔记

    第一:如果使用BeanFactory作为Spring Bean的工厂类,则所有的bean都是在第一次使用该Bean的时候实例化 第二:如果使用ApplicationContext作为Spring Be ...

  4. QT_FORWARD_DECLARE_CLASS

    相当于class 类名. 那么他和#include 包含头文件有什么区别呢 首先我们为什么要包括头文件问题的回答很简单通常是我们需要获得某个类型的定义(definition).那么接下来的问题 ...

  5. js的严格模式详解

    什么是js的严格模式? 严格模式指的是使js在更为严格的条件下运行.严格模式的主要作用是规范我们写代码习惯,以及为js升级做好铺垫.  如何使用严格模式? <script> //直接在代码 ...

  6. Linux入门之常用命令(7)压缩

    compress filename 压缩   -d解压缩  *.Z bzip -d解压缩 -z压缩 *.bz2 bzcat filename .bz2 读取压缩文件内容 gzip -d解压缩  -#压 ...

  7. load data(sql)

    一般对于数据库表的插入操作,我们都会写程序执行插入sql,插入的数据少还可以,如果数据多了.执行效率上可能就不太理想了.load data语句用于高速地从一个文本文件中读取数据,装载到一个表中,相比于 ...

  8. Beautiful Dream hdu3418 (直接做或二分)

    Beautiful Dream Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  9. 原创:工作指派问题解决方案---模拟退火算法C实现

    本文忽略了对于模拟退火的算法的理论讲解,读者可参考相关的博文或者其他相关资料,本文着重于算法的实现: /************************************************ ...

  10. Java基础语法(下篇)

     Java基础语法(下篇) 内容概要:        (1)函数的定义        (2)函数的特点        (3)函数的应用        (4)函数的重载               ...