力扣144
题目
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
示例1
输入:root = [1,null,2,3]
输出:[1,2,3]
示例2
输入:root = []
输出:[]
示例3
输入:root = [1]
输出:[1]
示例4
输入:root = [1,2]
输出:[1,2]
示例5
输入:root = [1,null,2]
输出:[1,2]
提示:
1. 树中节点数目在范围 [0, 100] 内
2. -100 <= Node.val <= 100
思路
题目给出二叉树的根节点,我们从根节点出发,遍历整个二叉树,题目要求得遍历顺序是前序遍历,那么遍历顺序就是先根节点,再左子节点,最后右子节点
这里要注意我们手写顺序的话是不断的将左右子节点当做根节点来进行下一步的书写的,因此到代码里,思路还是一样,我们还是从根节点出发,“输出”根节点,随后对左右子节点进行递归
代码
主函数中我们创建ans容器用于保存答案,然后传入travel函数中
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> ans;
travel(root, ans);
return ans;
}
};
注意,travel函数是递归遍历二叉树的函数
在travel函数中,先要判空,因为我们遍历到叶节点后就得返回了,因此要先判空
void travel(TreeNode* root, vector<int> &res) {
if(!root) {
return;
}
}
判空后我们直接把当前节点值加入答案,因为当前点就是根节点,又因为前序遍历也是先访问根节点
void travel(TreeNode* root, vector<int> &res) {
if(!root) {
return;
}
res.push_back(root->val);
}
然后是左右子节点的递归访问
void travel(TreeNode* root, vector<int> &res) {
if(!root) {
return;
}
res.push_back(root->val);
travel(root->left, res);
travel(root->right, res);
}
把代码整合一下
完整代码:
class Solution {
public:
void travel(TreeNode* root, vector<int> &res) {
if(!root) {
return;
}
res.push_back(root->val);
travel(root->left, res);
travel(root->right, res);
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int> ans;
travel(root, ans);
return ans;
}
};
因为力扣94和力扣145分别是二叉树的中序,后序遍历,并且这三题的代码以及思路只有顺序的不同
就是在进入trvael函数后,“输出”当前节点值,递归访问左子节点,递归访问右子节点这三者顺序的不同,所以下面我把另外两题代码贴出来
力扣94
代码
完整代码:
class Solution {
public:
void travel(TreeNode* root, vector<int> &res) {
if(!root) {
return;
}
travel(root->left, res);
res.push_back(root->val);
travel(root->right, res);
}
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
travel(root, res);
return res;
}
};
力扣145
代码
完整代码:
class Solution {
public:
void travel(TreeNode* root, vector<int> &res) {
if(!root) {
return;
}
travel(root->left, res);
travel(root->right, res);
res.push_back(root->val);
}
vector<int> postorderTraversal(TreeNode* root) {
vector<int> ans;
travel(root, ans);
return ans;
}
};