Leetcode94
1.问题描述
2.解决方案
解法一:递归
//正确递归
class Solution {
public:
void inorder(vector<int>& ans,TreeNode* root){
if(root==nullptr) return;
inorder(ans,root->left);
ans.push_back(root->val);
inorder(ans,root->right);
}
vector<int> inorderTraversal(TreeNode* root) {
vector<int> ans;
inorder(ans,root);
return ans;
}
};
解法二:迭代
一个很重要的问题要讨论,就是在前序遍历中没体现出来的一个点,那就是在迭代过程中,其实分两步
1.处理
2.访问
1.那么前序遍历实际上访问和处理元素的顺序是一致的,也就是都是从根开始慢慢向下,而中序不是,访问顺序也是从根慢慢往下,但是处理顺序则是从下面慢慢上来,所以就存在处理顺序和访问顺序不一致的问题!(非常重要!需要理解!)
2.代码实现过程呢我也已经在笔记中记录清楚了!
class Solution1 {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> ans;
stack<TreeNode*> s;
if(root== nullptr) return ans;
TreeNode* cur=root;
while(cur!= nullptr||s.empty()== false){
if(cur!= nullptr){
s.push(cur);
cur=cur->left;
continue;
}
if(cur==nullptr){
//1.
cur=s.top();
ans.push_back(cur->val);
s.pop();
//2.
cur=cur->right;
}
}
return ans;
}
};