--- tags: leetcode --- # [144. Binary Tree Preorder Traversal](https://leetcode.com/problems/binary-tree-preorder-traversal/) --- # My Solution ## Solution 1: DFS (recursion) ### The Key Idea for Solving This Coding Question ### C++ Code ```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) {} * }; */ class Solution { public: vector<int> preorderTraversal(TreeNode *root) { dfs(root); return preorder; } private: vector<int> preorder; void dfs(TreeNode *root) { if (root == nullptr) { return; } preorder.push_back(root->val); dfs(root->left); dfs(root->right); } }; ``` ### Time Complexity $O(n)$ $n$ is the number of nodes in the binary tree. ### Space Complexity $O(H)$ $H$ is the height of the binary tree. ## Solution 2: DFS (iteration, stack) ### The Key Idea for Solving This Coding Question ### C++ Code 1 ```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) {} * }; */ class Solution { public: vector<int> preorderTraversal(TreeNode *root) { stack<TreeNode *> st; vector<int> preorder; while (!st.empty() || root != nullptr) { if (root != nullptr) { st.push(root); preorder.push_back(root->val); root = root->left; } else { root = st.top(); st.pop(); root = root->right; } } return preorder; } }; ``` ### C++ Code 2 ```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) {} * }; */ class Solution { public: vector<int> preorderTraversal(TreeNode *root) { if (root == nullptr) { return {}; } stack<TreeNode *> st; vector<int> preorder; st.push(root); while (!st.empty()) { TreeNode *node = st.top(); st.pop(); preorder.push_back(node->val); if (node->right != nullptr) { st.push(node->right); } if (node->left != nullptr) { st.push(node->left); } } return preorder; } }; ``` ### Time Complexity $O(n)$ $n$ is the number of nodes in the binary tree. ### Space Complexity $O(H)$ $H$ is the height of the binary tree. ## Solution 3: Morris Traversal ### The Key Idea for Solving This Coding Question ### C++ Code ```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) {} * }; */ class Solution { public: vector<int> preorderTraversal(TreeNode *root) { vector<int> preorder; while (root != nullptr) { if (root->left == nullptr) { preorder.push_back(root->val); root = root->right; } else { TreeNode *pre = root->left; while (pre->right != nullptr && pre->right != root) { pre = pre->right; } if (pre->right == nullptr) { preorder.push_back(root->val); pre->right = root; root = root->left; } else { pre->right = nullptr; root = root->right; } } } return preorder; } }; ``` ### Time Complexity $O(n)$ $n$ is the number of nodes in the binary tree. ### Space Complexity $O(1)$ # Miscellaneous [94. Binary Tree Inorder Traversal](https://leetcode.com/problems/binary-tree-inorder-traversal) [145. Binary Tree Postorder Traversal](https://leetcode.com/problems/binary-tree-postorder-traversal) <!-- # Test Case ``` [1,null,2,3] ``` ``` [] ``` ``` [1] ``` ``` [4,2,7,1,3] ``` ``` [18,2,22,null,null,null,63,null,84,null,null] ``` ``` [18,6,22,5,7,11,63,1,2,9,8,10,24,12,84] ``` ``` [1,2,3] ``` ``` [4,2,1,3,7] ``` ``` [18,2,22,63,84] ``` ``` [18,6,5,1,2,7,9,8,22,11,10,24,63,12,84] ``` -->