给定一个二叉树,返回它的 后序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [3,2,1]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
来源:力扣(LeetCode)
解法一:迭代
前序遍历为 root -> left -> right,后序遍历为 left -> right -> root。可以修改前序遍历成为 root -> right -> left,那么这个顺序就和后序遍历正好相反。
/** * 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 { public: vector<int> postorderTraversal(TreeNode* root) { vector<int> ret; stack<TreeNode*> S; while (true) { if (root) { ret.push_back(root->val); S.push(root->left); //改变访问顺序 root = root->right; } else if (!S.empty()) { root = S.top(); S.pop(); } else break; } reverse(ret.begin(), ret.end()); //逆序 return ret; } };
解法二:递归
/** * 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 { public: vector<int> ret; vector<int> postorderTraversal(TreeNode* root) { if (root == nullptr) return ret; postorderTraversal(root->left); postorderTraversal(root->right); ret.push_back(root->val); return ret; } };