给定一个二叉树,返回它的 后序 遍历。
解法二:非递归形式
采用两个栈实现后续遍历的过程,具体流程如下:
1、申请一个栈,记为sck1,将头节点压入栈sck1中。
2、从sck1中弹出的节点记为tmpNode,然后依次将tmpNode的左孩子和右孩子节点压入sck1中。
3、在整个过程中,每次从sck1中pop出的节点都放入sck2中。
4、不断重复步骤2和步骤3,直到sck1为空,过程停止。
5、从sck2中依次弹出节点并存储,其结果就是后续遍历的结果。
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> sck1;
stack<TreeNode*> sck2;
if(root != nullptr) sck1.push(root);
while(!sck1.empty())
{
TreeNode* tmpNode = sck1.top();
sck1.pop();
sck2.push(tmpNode);
if(tmpNode->left) sck1.push(tmpNode->left);
if(tmpNode->right) sck1.push(tmpNode->right);
}
while(!sck2.empty())
{
TreeNode* tmpNode = sck2.top();
result.push_back(tmpNode->val);
sck2.pop();
}
return result;
}
};