点击链即可查看题目: 145. 二叉树的后序遍历 - 力扣(LeetCode)
一、题目
给你一棵二叉树的根节点
root
,返回其节点值的 后序遍历。示例 1:
**输入:**root = [1,null,2,3]
输出:[3,2,1]
解释:
示例 2:
**输入:**root = [1,2,3,4,5,null,8,null,null,6,7,9]
输出:[4,6,7,5,2,9,8,3,1]
解释:
示例 3:
**输入:**root = []
输出:[]
示例 4:
**输入:**root = [1]
输出:[1]
提示:
- 树中节点的数目在范围
[0, 100]
内-100 <= Node.val <= 100
二、解题思路以及代码
cpp
/**
* 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<int> postorderTraversal(TreeNode* root)
{
stack<TreeNode*> st;
vector<int> v;
TreeNode* prev = nullptr;
//先访问左路节点
TreeNode* cur = root;
while(cur || !st.empty())
{
while(cur)
{
//左路节点访问,并且入栈
st.push(cur);
cur = cur->left;
}
//取栈顶元素
TreeNode* top = st.top();
//访问右子树
//右子树为空 或 prev是top的右,证明右子树已经访问完了
if(nullptr == top->right || prev == top->right)
{
v.push_back(top->val);
st.pop();
prev = top;
}
else//右子树不为空,并且没有访问
{
cur = top->right;
}
}
return v;
}
};