题目
给定一个二叉树,返回它的后序遍历。
题解
递归版本很简单,在此跳过。
令人头疼的迭代版本:
vector<int> postorderTraversal(TreeNode* root) {
if(root == nullptr)
return {};
vector<int> num;
stack<TreeNode*> s;
TreeNode* prev;
while(!s.empty() || root != nullptr){
while(root != nullptr){ // 左孩子非空找左孩子
s.push(root);
root = root->left;
}
root = s.top(); // 左孩子为空回溯到父节点
s.pop();
if(root->right == nullptr || root->right == prev){ // 右孩子为空或已经从右孩子回溯的情况,进一步回溯
num.push_back(root->val);
prev = root;
root = nullptr; // 去空指针的情况pop
}
else{
s.push(root); // 右孩子非空正常遍历,为了回溯把当前节点压栈
root = root->right;
}
}
return num;
}
注意:一个父节点有几个孩子就会有几次压栈过程。