解法一 recursion
三种方法,不同在于如何处理vector
class Solution {
public:
vector<int> preorderTraversal(TreeNode * root) {
if(!root) return {};
vector<int> res{root->val};
vector<int> left = preorderTraversal(root->left);
vector<int> right = preorderTraversal(root->right);
res.insert(res.end(), left.begin(), left.end());
res.insert(res.end(), right.begin(), right.end());
return res;
}
};
class Solution {
public:
vector<int> preorderTraversal(TreeNode * root) {
vector<int> res;
helper(root, res);
return res;
}
void helper(TreeNode* root, vector<int>& res){
if(!root) return;
res.push_back(root->val);
helper(root->left, res);
helper(root->right, res);
}
};
class Solution {
public:
vector<int> res;
vector<int> preorderTraversal(TreeNode * root) {
res.clear();
helper(root);
return res;
}
void helper(TreeNode* root){
if(!root) return;
res.push_back(root->val);
helper(root->left);
helper(root->right);
}
};
解法二 non-recursion
先right再left因为stack
class Solution {
public:
vector<int> preorderTraversal(TreeNode * root) {
stack<TreeNode*> st;
vector<int> res;
if(!root) return res;
st.push(root);
while(!st.empty()){
TreeNode* t = st.top(); st.pop();
res.push_back(t->val);
if(t->right) st.push(t->right);
if(t->left) st.push(t->left);
}
return res;
}
};