使用迭代的版本:node
#include <vector> /** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: std::vector<int> postorderTraversal(TreeNode *root) { vector<int> result; traversal(result, root); return result; } void traversal(std::vector<int>& result, TreeNode *node) { if (node == NULL) return; traversal(result, node->left); traversal(result, node->right); result.push_back(node->val); } };
不使用迭代的版本(使用棧):post
#include <stack> #include <vector> #include <algorithm> /** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: // 至關於倒着遍歷一遍節點,postorder的輸出順序應該是 (left -> right -> node) // 那咱們如今就按照倒敘遍歷這顆樹並利用棧的性質進行輸出 (node -> right -> left) // 每次在遍歷的時候都把棧頂元素出棧,至關於獲得當前未遍歷節點集合的最後一個節點 std::vector<int> postorderTraversal(TreeNode *root) { std::vector<int> result; std::stack<TreeNode *> _stack; if (root == NULL) return result; _stack.push(root); while (!_stack.empty()) { // 出棧當前節點值 TreeNode *cur = _stack.top(); _stack.pop(); result.push_back(cur->val); // 入棧左子節點 TreeNode *left = cur->left; if (left) _stack.push(left); // 入棧右子節點 TreeNode *right = cur->right; if (right) _stack.push(right); } std::reverse(result.begin(), result.end()); return result; } }; #endif // BINARY_TREE_POSTORDER_TRAVERSAL_H