2019-08-11 07:40:23 +00:00
|
|
|
# [144. Binary Tree Preorder Traversal](https://leetcode.com/problems/binary-tree-preorder-traversal/)
|
|
|
|
# 思路
|
2020-06-25 10:53:21 +00:00
|
|
|
要求进行二叉树的前序遍历, 属于务必掌握的基本题目。
|
2019-08-11 07:40:23 +00:00
|
|
|
## 思路一 递归
|
|
|
|
最简单的当然就是递归遍历了, 先遍历当前节点, 再递归遍历左子树, 再递归遍历右子树. 递归出口就是当前节点为空.
|
|
|
|
|
|
|
|
## 思路二 迭代
|
2020-06-25 10:53:21 +00:00
|
|
|
稍微难一点的就是迭代遍历. 这里一共有三种写法, 注意领会相互区别,关键点就是**右孩子比左孩子先入栈**。
|
2019-08-11 07:40:23 +00:00
|
|
|
|
|
|
|
# C++
|
|
|
|
## 思路一 递归
|
|
|
|
``` C++
|
|
|
|
class Solution {
|
|
|
|
private:
|
|
|
|
void helper(vector<int>&res, TreeNode *root){
|
|
|
|
if(!root) return;
|
|
|
|
res.push_back(root -> val);
|
|
|
|
helper(res, root -> left);
|
|
|
|
helper(res, root -> right);
|
|
|
|
}
|
|
|
|
public:
|
|
|
|
vector<int> preorderTraversal(TreeNode* root) {
|
|
|
|
vector< int>res;
|
|
|
|
helper(res, root);
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
```
|
|
|
|
|
|
|
|
## 思路二 迭代
|
|
|
|
|
|
|
|
### 写法一
|
|
|
|
``` C++
|
|
|
|
class Solution {
|
|
|
|
public:
|
|
|
|
vector<int> preorderTraversal(TreeNode* root) {
|
|
|
|
vector<int> res;
|
|
|
|
if (!root) return res;
|
|
|
|
stack<TreeNode*> stk{{root}}; // 注意这种初始化方法
|
|
|
|
TreeNode *p;
|
|
|
|
while (!stk.empty()) {
|
|
|
|
p = stk.top();
|
|
|
|
stk.pop();
|
|
|
|
|
|
|
|
res.push_back(p -> val); // 先访问
|
|
|
|
if(p -> right) stk.push(p -> right); // 再将右子树入栈
|
|
|
|
if(p -> left) stk.push(p -> left);
|
|
|
|
}
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 写法二
|
|
|
|
``` C++
|
|
|
|
class Solution {
|
|
|
|
public:
|
|
|
|
vector<int> preorderTraversal(TreeNode* root) {
|
|
|
|
vector<int>res;
|
|
|
|
if(!root) return res;
|
|
|
|
|
|
|
|
TreeNode *p = root;
|
|
|
|
stack<TreeNode *>stk;
|
|
|
|
while(!stk.empty() || p){
|
|
|
|
if(!p){ // 向左下降不动了, 从栈顶pop元素
|
|
|
|
p = stk.top();
|
|
|
|
stk.pop();
|
|
|
|
}
|
|
|
|
|
|
|
|
res.push_back(p -> val);
|
|
|
|
if(p -> right) stk.push(p -> right);
|
|
|
|
p = p -> left;
|
|
|
|
}
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 写法三
|
|
|
|
``` C++
|
|
|
|
class Solution {
|
|
|
|
public:
|
|
|
|
vector<int> preorderTraversal(TreeNode* root) {
|
|
|
|
vector<int>res;
|
|
|
|
if(!root) return res;
|
|
|
|
|
|
|
|
TreeNode *p;
|
|
|
|
stack<TreeNode *>stk;
|
|
|
|
stk.push(root);
|
|
|
|
while(!stk.empty()){
|
|
|
|
p = stk.top();
|
|
|
|
stk.pop();
|
|
|
|
|
|
|
|
while(p){ // 一路向左下降
|
|
|
|
res.push_back(p -> val);
|
|
|
|
if(p -> right) stk.push(p -> right);
|
|
|
|
p = p -> left;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
```
|