题目:
给定一个二叉树,返回它的 后序 遍历。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
/*****************法一::****递归法******************************/
// // 第二次写,还写错了,这个vector数组要传入 引用啊!by reference
// void postorder(TreeNode* cur,vector<int>& res)
// {
// if(cur==NULL)
// {
// return;
// }
// postorder(cur->left,res);
// postorder(cur->right,res);
// res.push_back(cur->val);
// }
// vector<int> postorderTraversal(TreeNode* root) {
// vector<int> result;
// postorder(root,result);
// return result;
// }
// /********************法二::*****迭代法*********************************/
// vector<int> postorderTraversal(TreeNode* root) {
// stack<TreeNode*> st;
// vector<int> result;
// st.push(root);
// // 非空才执行,别写反啦!!!
// while(!st.empty())
// {
// TreeNode* Node = st.top();
// st.pop();
// if(Node!=NULL)
// {
// result.push_back(Node->val);
// }
// // ?????????????????? 这里不懂,为什么要写continue;
// else
// continue;
// if(Node->left!=NULL)
// {
// st.push(Node->left);
// }
// if(Node->right!=NULL)
// {
// st.push(Node->right);
// }
// }
// reverse(result.begin(),result.end());
// return result;
// }
/********************法三::*****标记法*********************************/
vector<int> postorderTraversal(TreeNode* root)
{
vector<int> result;
stack<TreeNode*> st;
if(root != nullptr)
{
st.push(root);
}
while(!st.empty())
{
TreeNode* node = st.top();
if(node != nullptr)
{
st.push(nullptr); // 中节点已经在栈中了,因此只需要加标记空指针
if(node->right)
{
st.push(node->right); // 右节点压栈
}
if(node->left)
{
st.push(node->left); // 左节点压栈
}
}
else
{
st.pop();
node=st.top();
st.pop();
result.push_back(node->val);
}
}
return result;
}
};