LeetCode: 145. Binary Tree Postorder Traversal
LeetCode: 145. Binary Tree Postorder Traversal
题目描述
Given a binary tree, return the postorder traversal of its nodes’ values.
Example:
Input: [1,null,2,3]
1
\
2
/
3
Output: [3,2,1]
Follow up: Recursive solution is trivial, could you do it iteratively?
解题思路 —— 用STL的栈模拟系统栈
分别用两个 stack
来模拟递归计算的系统栈。
AC 代码
/** * 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
{
// 递归实现
void postorderTraversalRecursive(TreeNode* root, vector<int>& postSeq)
{
if(root == nullptr) return;
postorderTraversalRecursive(root->left, postSeq);
postorderTraversalRecursive(root->right, postSeq);
postSeq.push_back(root->val);
}
// 非递归实现(模拟递归)
void postorderTraversalWithoutRecursive(TreeNode* root, vector<int>& postSeq)
{
if(root == nullptr) return;
stack<TreeNode*> stk; // 模拟递归的堆栈
stack<int> outStk; // 模拟输出的堆栈
stk.push(root);
do
{
// 读取参数
TreeNode* rootParam = stk.top();
stk.pop();
if(rootParam == nullptr)
{
postSeq.push_back(outStk.top());
outStk.pop();
continue;
}
stk.push(nullptr); // 标记输出堆栈的位置
// 反向压入输入堆栈
if(rootParam->right != nullptr) stk.push(rootParam->right);
if(rootParam->left != nullptr) stk.push(rootParam->left);
//压入输出堆栈
outStk.push(rootParam->val);
}while(!stk.empty());
}
public:
vector<int> postorderTraversal(TreeNode* root)
{
vector<int> postSeq;
postorderTraversalWithoutRecursive(root, postSeq);
return postSeq;
}
};