题目描述
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
输入:root = [1,null,2,3]
输出:[1,2,3]
思路
辅助函数 traversal:
- 参数: 接受两个参数,一个是指向树节点的指针 cur(表示当前访问的节点),另一个是一个整型向量的引用 vec(用于存储遍历的结果)。
- 功能:该函数用于递归地执行前序遍历。
- 实现:
递归基: 如果当前节点 cur 是 NULL,则直接返回。这表示到达了叶节点的子节点。
记录节点值: 将当前节点的值添加到 vec 中。这是前序遍历的“访问根节点”部分。
递归左子树: 调用 traversal 函数自身,以当前节点的左子节点 cur->left 作为新的当前节点。
递归右子树: 调用 traversal 函数自身,以当前节点的右子节点 cur->right 作为新的当前节点。
主函数 preorderTraversal:
- 参数: 接受一个指向树的根节点的指针 root。
- 功能: 初始化一个空的整型向量 result,并调用 traversal 函数来填充这个向量,最后返回填充后的向量。
- 实现:
创建一个名为 result 的空向量,用来存放前序遍历的结果。
调用 traversal 函数,传入根节点 root 和向量result。
返回向量 result,其中包含了树的前序遍历结果。
完整代码
#include<iostream>
#include<vector>
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
class Solution {
public:
std::vector<int> preorderTraversal(TreeNode* root) {
std::vector<int> result;
traversal(root, result);
return result;
}
void traversal(TreeNode* cur, std::vector<int>& vec)
{
if(cur == NULL) return;
vec.push_back(cur->val);
traversal(cur->left, vec);
traversal(cur->right, vec);
}
};
int main()
{
TreeNode* root = new TreeNode(1);
root->right = new TreeNode(2);
root->right->left = new TreeNode(3);
Solution s;
std::vector<int> result = s.preorderTraversal(root);
for (int value : result) {
std::cout << value << " ";
}
std::cout << std::endl;
return 0;
}