题目:
Given a binary tree, return the postorder traversal of its nodes' values.
For example:
Given binary tree{1,#,2,3},
1
\
2
/
3
return[3,2,1].
Note: Recursive solution is trivial, could you do it iteratively?
非递归实现二叉树的后序遍历 ,使用栈保存好每次的根节点就好了 .。。
遍历需要注意的地方就是:判断当前的结点的 子树有没有访问完
代码分析:
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
#include<stack>
//后序遍历二叉树
class Solution {
public:
vector<int> postorderTraversal(TreeNode *root) {
vector<int> ret;
stack<TreeNode*> data;
TreeNode* prev = NULL;
if(root == NULL)
return ret;
while(data.empty() == false||root)
{
while(root)
{
data.push(root);
root = root->left;
}
root = data.top();
//用来判断当前的结点的右结点有没有遍历过
if(root->right == NULL||(root->right == prev))
{
ret.push_back(root->val);
prev = root;
data.pop();
root = NULL;
}
else
{
root = root->right;
}
}
return ret;
}
};
代码解析:
1、
if(root->right == NULL||(root->right == prev))
这句代码使用的,使用的很是巧,
当前结点的有孩子为空 ,或者是当前结点右孩子已经被访问过了。才能访问当前的结点
2、
stack<TreeNode*> data;
使用栈来保存前面没有访问的结点;
3、
TreeNode* prev = NULL;
使用prev来保存的是上一个被访问的结点