这道题是要求写出二叉树的后序遍历,不用递归。
还是用栈。先把根入栈,然后右子树入栈,然后左子树入栈。
这个题的难点在一个问题:比如[1,2,3]这棵树,先把1入栈,1有右子树,3入栈,1有左子树,2入栈。2的左右字数都为空,2出栈;3的左右子树都为空,3出栈。
这时候栈的顶端是1,1有左右子树,如果重复上面的循环,那2和3又放入栈中了,程序就会无限循环。
解决方法是,我用一个指针tmp记录上一个pop出来的节点,如果当前这个节点的左子树是tmp或者右子树是tmp,说明这是上一个pop出来的节点的父节点,这时候不能再把他的左右子树加进去了,而是应该把这个节点pop出来。
/**
* 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) return {};
vector<int> res;
stack<TreeNode*> s;
s.push(root);
TreeNode* tmp = root;
while(!s.empty()){
TreeNode* node = s.top();
if((node->left == NULL && node->right == NULL) || (tmp == node->left || tmp == node->right)){
res.push_back(node->val);
s.pop();
tmp = node;
}else{
if(node->right) s.push(node->right);
if(node->left) s.push(node->left);
}
}
return res;
}
};