题目描述
知识点
后序遍历的迭代实现
结果
实现
码前思考
- 需要迭代实现一下;
- 必须明确栈中的结点是没有被访问过的结点;
- 我们模拟一下自己进行后序遍历的过程:
- 我们是先一直往左边走直到走到最左边的没有左孩子的结点,然后我们就开始转向它的右孩子,寻找它的右孩子的最左结点。如此反复,直到我们找到一个叶子节点为止。
- 其实这个过程比较抽象,可以结合下面这张图看:
- 编码需要仔细地思考。
代码实现
/**
* 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> postorderTraversal(TreeNode* root) {
if(root == NULL){
return vector<int>();
}
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();
if(top->right != NULL){
root = top->right;
top->right = NULL;
}else{
res.push_back(top->val);
st.pop();
root=NULL;
}
}
}
return res;
}
};
码后反思
- 这里有一个小细节,就是在压栈了一个结点的右孩子之后,要将该结点的右孩子设置为
NULL
,这样做的原因是为了避免重复压栈它的右孩子; - 这个题目主要是要动手模拟一遍操作,光想是很难的,要动手模拟,代码才写得出。。。语言描述有点困难。