题目描述
知识点
中序遍历迭代实现
结果
实现
码前思考
- 始终注意是先左后右的原则;
- 然后一点就是只要我们的根结点在栈中,我们的右子树的信息就没有丢失!
- 我们都是在根结点出栈的时候才放入右结点的,此前我们不放右结点。
代码实现
/**
* 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<int> inorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> st;
while(1){
while(root != NULL){
st.push(root);
root = root->left;
}
if(st.empty()){
break;
}else{
TreeNode* top = st.top();
res.push_back(top->val);
st.pop();
root = top->right;
}
}
return res;
}
};
码后反思
- 多动手模拟。。。
二刷代码
这次我用了另外一种奇特的算法。。。
我认为我这种算法其实会更好理解一些。。。
/**
* 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<int> inorderTraversal(TreeNode* root) {
stack<TreeNode* > st;
vector<int> res;
if(root==NULL){
return res;
}
st.push(root);
while(!st.empty()){
TreeNode* cur = st.top();
if(cur->left!=NULL){
st.push(cur->left);
cur->left=NULL;//设置为空
}else{
//说明可以进行打印了
res.push_back(cur->val);
st.pop();
if(cur->right!=NULL){
st.push(cur->right);
}
}
}
return res;
}
};