mirror of
https://github.com/ShusenTang/LeetCode.git
synced 2024-09-02 14:20:01 +00:00
2.6 KiB
2.6 KiB
144. Binary Tree Preorder Traversal
思路
要求进行二叉树的前序遍历, 属于务必掌握的基本题目。
思路一 递归
最简单的当然就是递归遍历了, 先遍历当前节点, 再递归遍历左子树, 再递归遍历右子树. 递归出口就是当前节点为空.
思路二 迭代
稍微难一点的就是迭代遍历. 这里一共有三种写法, 注意领会相互区别,关键点就是右孩子比左孩子先入栈。
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;
}
};
思路二 迭代
写法一
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;
}
};
写法二
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;
}
};
写法三
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;
}
};