leetcode 145. 二叉树的后序遍历
给定一个二叉树,返回它的后序遍历。
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) {}
};
递归三部曲
参数和返回值:输入根节点,输出遍历结果vector
递归的单层逻辑:当前节点的左右子树都否为空,前节点添加到结果集,否则继续遍历它的左右子树
递归函数的终止条件:当前节点为空则返回
class Solution {
vector<int> result;
public:
vector<int> postorderTraversal(TreeNode* root) {
if(root == nullptr)
return result;
postorderTraversal(root->left);
postorderTraversal(root->right);
result.push_back(root->val);
return result;
}
};
迭代解法
当前节点不为空,将其添加到结果集,当前节点入栈,当前节点更新为它的右孩子,当前节点的右孩子为空,则当前节点更新为栈顶节点的左孩子,当栈为空且当前节点为空时,结束循环,结果集为右左中的遍历顺序,后序遍历为中左右,将结果集反转即可
vector<int> postorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> nodeStack;
while(!nodeStack.empty() || root != nullptr){
if(root != nullptr){
result.push_back(root->val);
nodeStack.push(root);
root = root->right;
continue;
}
root = nodeStack.top()->left;
nodeStack.pop();
}
reverse(result.begin(), result.end());
return result;
}