相关
- 二叉树的中序遍历:94
- 二叉树的后序遍历:145
- N叉树的前序遍历:589
- N叉树的后序遍历:590
1. 递归
根左右直接递归实现。
时间O(n)
,空间O(n)
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
class Solution { public: vector<int> preorderTraversal(TreeNode* root) { if (root == nullptr) return {}; vector<int> ans; ans.push_back(root->val); vector<int> leftAns = preorderTraversal(root->left); vector<int> rightAns = preorderTraversal(root->right); ans.insert(ans.end(), leftAns.begin(), leftAns.end()); ans.insert(ans.end(), rightAns.begin(), rightAns.end());
return ans; } };
|
2. 迭代
用stack模拟递归栈。
访问栈顶元素(根) -> 右节点压栈 -> 左节点压栈 ->
上述循环中,左节点入栈之后接着就出栈了,所以可以只将右节点入栈,下次直接访问左节点。
时间O(n)
,空间O(n)
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
class Solution { public: vector<int> preorderTraversal(TreeNode* root) { stack<TreeNode*> st; vector<int> ans; while (!st.empty() || root != nullptr) { if (root == nullptr) { root = st.top(); st.pop(); } ans.push_back(root->val); if (root->right != nullptr) st.push(root->right); root = root->left; }
return ans; } };
|