方法一:
递归实现
方法二:
迭代实现
/*
* 因为根节点是最先处理的,但要最后输出,所以可用将各个节点入栈2次,当节点出栈时栈顶与出栈节点的值不一样时,打印输出。
*
* 总思路就是把根、右子树、左子树都压入栈中2次
* 每次循环释放一个栈中元素,如果释放的和栈顶元素相同证明没有被操作过~~
* 就分别将其右子树和左子树都压入栈中。
*/
方法三:
迭代实现:
ref: https://leetcode-cn.com/problems/binary-tree-postorder-traversal/submissions/
非递归遍历中,后序遍历相对更难实现,因为需要在遍历完左右子节点之后,再遍历根节点,因此不能直接将根节点出栈。这里使用一个 last 指针记录上次出栈的节点,当且仅当节点的右孩子为空(top->right == NULL),或者右孩子已经出栈(top->right == last),才将本节点出栈:
C++:
vector<int> postorderTraversal(TreeNode* root) {
TreeNode *p = root;
vector<int> result;
if (!p) {
return result;
}
TreeNode *top, *last = NULL;
stack<TreeNode *> q;
while (p || !q.empty()) {
if (p) {
q.push(p);
p = p->left;
} else {
top = q.top();
if (top->right == NULL || top->right == last) {
q.pop();
result.push_back(top->val);
last = top;
} else {
p = top->right;
}
}
}
return result;
}