描述
给出一棵二叉树,返回其节点值的后序遍历。
解答:
了解下后序遍历,在二叉树中,先左后右再根,即首先遍历左子树,然后遍历右子树,最后访问根结点。
那么非递归的思想下,我们可以考虑采用深度优先遍历访问节点的算法来输出后序遍历。由此我们需要借助栈。
同时,我们需要考虑到如何确认节点是否被访问过,因此我们借助set容器保存已经被访问过的节点。容器内的节点表示该节点被访问过。
代码:
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param root: A Tree
* @return: Postorder in ArrayList which contains node values.
*/
vector<int> postorderTraversal(TreeNode * root) {
// write your code here
std::stack<TreeNode*> tmp;
std::set<TreeNode*> setUsed;
vector<int> vec;
if(root == NULL)
{
return vec;
}
tmp.push(root);
while(tmp.size())
{
TreeNode*& top = tmp.top();
// 当左孩子未访问过,则将左孩子压入栈
if(top->left && !setUsed.count(top->left))
{
tmp.push(top->left);
continue;
}
// 当右孩子未访问过,则将右孩子压入栈
if(top->right && !setUsed.count(top->right))
{
tmp.push(top->right);
continue;
}
// 左右孩子为空,为当前树的根,压入到后续遍历容器中
vec.push_back(top->val);
// 记录已经被访问过
setUsed.insert(top);
// 出栈
tmp.pop();
}
return vec;
}
};