# Binary Tree Preorder/Inorder/Postorder/Levelorder Traversal Template (Recursive/Iteration) ###### tags: `algorithm template` `c++` `Binary Tree` TreeNode Define ```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) {} * }; */ ``` ## Recursive #### Preorder ```cpp= class Solution { public: vector<int> res; void traversal(TreeNode *cur) { if (cur == nullptr) { return; } res.push_back(cur->val); // middle traversal(cur->left); // left traversal(cur->right); // right } vector<int> preorderTraversal(TreeNode* root) { traversal(root); return res; } }; ``` #### Inorder ```cpp= class Solution { public: vector<int> res; void traversal(TreeNode *cur) { if (cur == nullptr) { return; } traversal(cur->left); // left res.push_back(cur->val); // middle traversal(cur->right); // right } vector<int> inorderTraversal(TreeNode* root) { traversal(root); return res; } }; ``` ```cpp= class Solution { public: vector<int> res; TreeNode *pre; void traversal(TreeNode *cur) { if (cur == nullptr) { return; } traversal(cur->left); if (pre != nullptr) { res.push_back(pre->val); } pre = cur; traversal(cur->right); } vector<int> inorderTraversal(TreeNode* root) { traversal(root); if (pre != nullptr) { res.push_back(pre->val); } return res; } }; ``` #### Postorder ```cpp= class Solution { public: vector<int> res; void traversal(TreeNode *cur) { if (cur == nullptr) { return; } traversal(cur->left); // left traversal(cur->right); // right res.push_back(cur->val); // middle } vector<int> postorderTraversal(TreeNode* root) { traversal(root); return res; } }; ``` Preorder / Inorder / Postorder的差別在只有三行(middle, left, right的順序). #### Levelorder ```cpp= class Solution { public: vector<vector<int>> res; void traversal(TreeNode *cur, int level) { if (cur == nullptr) { return; } if (res.size() == level) { res.push_back(vector<int>()); } res[level].push_back(cur->val); traversal(cur->left, level + 1); traversal(cur->right, level + 1); } vector<vector<int>> levelOrder(TreeNode* root) { traversal(root, 0); return res; } }; ``` ## Iteration #### Preorder ```cpp= class Solution { public: vector<int> preorderTraversal(TreeNode* root) { stack<TreeNode *> st; vector<int> res; if (root != nullptr) { st.push(root); } while (!st.empty()) { TreeNode *node = st.top(); st.pop(); res.push_back(node->val); if (node->right) { st.push(node->right); } if (node->left) { st.push(node->left); } } return res; } }; ``` #### Inorder ```cpp= class Solution { public: vector<int> inorderTraversal(TreeNode* root) { TreeNode *cur = root; stack<TreeNode *> st; vector<int> res; while (!st.empty() || cur != nullptr) { if (cur != nullptr) { st.push(cur); cur = cur->left; } else { cur = st.top(); st.pop(); res.push_back(cur->val); cur = cur->right; } } return res; } }; ``` use `pre` pointer version. ```cpp= class Solution { public: vector<int> inorderTraversal(TreeNode* root) { TreeNode *cur = root; TreeNode *pre = nullptr; stack<TreeNode *> st; vector<int> res; while (!st.empty() || cur != nullptr) { if (cur != nullptr) { st.push(cur); cur = cur->left; } else { cur = st.top(); st.pop(); res.push_back(cur->val); pre = cur; cur = cur->right; } } return res; } }; ``` #### Postorder 基本上跟 Preorder 一樣, 最後多了reverse而已. ```cpp= class Solution { public: vector<int> postorderTraversal(TreeNode* root) { stack<TreeNode *> st; vector<int> res; if (root != nullptr) { st.push(root); } while (!st.empty()) { TreeNode *node = st.top(); st.pop(); res.push_back(node->val); if (node->right != nullptr) { st.push(node->right); } if (node->left != nullptr) { st.push(node->left); } } reverse(res.begin(), res.end()); return res; } }; ``` #### Levelorder ```cpp= class Solution { public: vector<vector<int>> levelOrder(TreeNode* root) { vector<vector<int>> res; queue<TreeNode*> q; if (root != nullptr) { q.push(root); } while (!q.empty()) { int size = q.size(); vector<int> level; for (int i = 0; i < size; i++) { TreeNode *node = q.front(); q.pop(); level.push_back(node->val); if (node->left) { q.push(node->left); } if (node->right) { q.push(node->right); } } res.push_back(level); } return res; } }; ``` ## Related Topics ### [LC 144. Binary Tree Preorder Traversal](https://leetcode.com/problems/binary-tree-preorder-traversal/) ### [LC 94. Binary Tree Inorder Traversal](https://leetcode.com/problems/binary-tree-inorder-traversal/) ### [LC 145. Binary Tree Postorder Traversal](https://leetcode.com/problems/binary-tree-postorder-traversal/) ### [LC 102. Binary Tree Level Order Traversal](https://leetcode.com/problems/binary-tree-level-order-traversal/) >### Complexity >n = number of tree's nodes >| | Time Complexity | Space Complexity | >| ----------- | --------------- | ---------------- | >| Preorder | O(n) | O(n) | >| Inorder | O(n) | O(n) | >| Postorder | O(n) | O(n) | >| Levelorder | O(n) | O(n) | ## Note [iteration reference](https://github.com/youngyangyang04/leetcode-master/blob/master/problems/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E7%BB%9F%E4%B8%80%E8%BF%AD%E4%BB%A3%E6%B3%95.md) [recursive reference](https://github.com/youngyangyang04/leetcode-master/blob/master/problems/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E8%BF%AD%E4%BB%A3%E9%81%8D%E5%8E%86.md)