144. 二叉树的前序遍历

给定一个二叉树,返回它的前序遍历。

Solution1(递归版):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
preorder(root,res);
return res;
}
void preorder(TreeNode* node, vector<int> &res){
if(!node) return;
res.push_back(node->val);
preorder(node->left, res);
preorder(node->right, res);
}

};

Solution2(迭代版):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
if(!root) return res;
stack<TreeNode*> s;
TreeNode* cur = root;
s.push(root);
while(!s.empty()){
cur = s.top();
s.pop();
res.push_back(cur->val);
if(cur->right) s.push(cur->right);
if(cur->left) s.push(cur->left);

}
return res;
}
};

前序遍历的顺序为先处理当前节点,再处理左节点,最后处理右节点。

对于栈来说。首先处理当前节点。然后先把右节点压入栈中,转而处理左节点。

OR

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode*> toVisit;
vector<int> result;
if(root == NULL){
return result;
}
TreeNode* current = root;
while(current || !toVisit.empty()){
if(current != NULL){
result.push_back(current->val);
toVisit.push(current->right);
current = current->left;
} else {
current = toVisit.top();
toVisit.pop();
}
}
return result;
}
};