递归
很简单,这里省略
栈
- 一开始觉得无从下手
- 结合递归和迭代栈的对比
- 递归是函数调用函数,构成的是一个调用栈,其过程就是一般的二叉树图,从根到叶子 按照 “根左右 左根右 左右根”中的某个顺序去调用,是一个从上往下的过程
- 迭代栈,也要达到这一目的。可你无法进行函数调用函数这一过程。现在需要用栈实现一层一层调用的效果。与此同时,在一层一层建立栈的同时,还需要考虑终止条件。
- 考虑的关键点
- 函数调用函数过程,和将结点压栈的过程,反向
- 终止条件,即标记法
- 整个过程中栈的变化:不同的遍历方式,栈的增长方式不同
- 前序遍历:每有一个“根左右”构成,会弹出根节点,整体就是“增加三个点,弹出一个点”
- 中序遍历:每有一个“左根右”构成,都不会弹出,而是到最左侧叶子节点才弹出
- 每个节点会在栈中出现两次
- 一次是为了遍历
- 一次是为了输出内容
前序 lq 144
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode*> stk;
vector<int> res;
if(root) stk.push(root);
while(stk.size()){
if(stk.top() != NULL){
auto tmp = stk.top();
stk.pop();
if(tmp -> right) stk.push(tmp -> right);
if(tmp -> left) stk.push(tmp -> left);
stk.push(tmp);
stk.push(NULL);
}else{
stk.pop();
res.push_back(stk.top() -> val);
stk.pop();
}
}
return res;
}
};
中序 lq145
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
stack<TreeNode*> stk;
vector<int> res;
if(root) stk.push(root);
while(stk.size()){
if(stk.top() != NULL){
auto tmp = stk.top();
stk.pop();
if(tmp -> right) stk.push(tmp -> right);
stk.push(tmp);
stk.push(NULL);
if(tmp -> left) stk.push(tmp -> left);
}else{
stk.pop();
res.push_back(stk.top() -> val);
stk.pop();
}
}
return res;
}
};
后序 lq94
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
stack<TreeNode*> stk;
vector<int> res;
if(root) stk.push(root);
while(stk.size()){
if(stk.top() != NULL){
auto tmp = stk.top();
stk.pop();
stk.push(tmp);
stk.push(NULL);
if(tmp -> right) stk.push(tmp -> right);
if(tmp -> left) stk.push(tmp -> left);
}else{
stk.pop();
res.push_back(stk.top() -> val);
stk.pop();
}
}
return res;
}
};
661

被折叠的 条评论
为什么被折叠?



