QUESTION
medium
题目描述
给定一个二叉树,返回它的前序遍历
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,2,3]
说明
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
SOLUTION
递归算法很简单,各种树的各种遍历的递归方法你应该很熟练
方法一(递归)
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
helper(root, res);
return res;
}
void helper(TreeNode* node, vector<int> &res){
if(!node) return;
res.push_back(node->val);
helper(node->left, res);
helper(node->right, res);
}
方法二(迭代)
前序遍历的迭代很简单,因为是先根,注意入栈的时候是先右孩子入栈
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
if(!root) return res;
stack<TreeNode*> s;
s.push(root);
TreeNode *p = NULL;
while(!s.empty()){
p = s.top();
s.pop();
res.push_back(p->val);
if(p->right) s.push(p->right);
if(p->left) s.push(p->left);
}
return res;
}
方法三(迭代的另一种写法)
本质上和方法二是一样的,大家可以看看两种写法区别在哪
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> s;
TreeNode *p = root;
while(!s.empty() || p){
if(p){
res.push_back(p->val);
s.push(p);
p = p->left;
}
else{
p = s.top();
s.pop();
p = p->right;
}
}
return res;
}