Try   HackMD

144. Binary Tree Preorder Traversal


My Solution

Solution 1: DFS (recursion)

The Key Idea for Solving This Coding Question

C++ Code

/** * 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

/** * 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

/** * 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

/** * 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
145. Binary Tree Postorder Traversal