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 Solution1 {
public:
void postorder(TreeNode *root,vector<int>& ret) {
if(!root)return ;
postorder(root->left,ret);
postorder(root->right,ret);
ret.emplace_back(root->val);
}
vector<int> postorderTraversal(TreeNode *root) {
vector<int> vec;
if(root==nullptr)return vec;
postorder(root,vec);
return vec;
}
};
//迭代
class Solution {
public:
vector<int> postorderTraversal(TreeNode *root) {
vector<int> vec;
if(!root) return vec;
stack<TreeNode *>stk;//显式维护一个栈
TreeNode *node = root;
TreeNode *prev = nullptr;//标记右节点已被访问
while(node || !stk.empty()) {
while(node!=nullptr) {
stk.emplace(node);
node = node->left;//先将左子树入栈
}
node = stk.top();
stk.pop();
if(node->right && node->right!=prev) {
stk.emplace(node);
node = node->right;
}else {
vec.emplace_back(node->val);
prev = node;//避免重复访问右子树
node = nullptr;//避免重复访问左子树
}
}
return vec;
}
};
LeetCode 145. 二叉树的后序遍历 题解 C/C++
于 2021-04-19 19:11:28 首次发布