class Solution {
public:
//这个函数是为了 遍历这个二叉树 其实你仔细想一想 那个栈 你感受一下 有没有感觉特像
void find_rl(TreeNode*cur,vector<int>&result)
{
if(cur==nullptr)
{
return;
} //这个地方就相当于是一个出口 相当于是你写一个递归函数你一定要找到他得出口,这个还是很重要的。
result.push_back(cur->val);//中
find_rl(cur->left,result);//左
find_rl(cur->right,result);//右
}
//这个就相当于 我利用这个上面那个递归
//最好这个二叉树真的就是这么写 真的 挺好 考的明白
vector<int> preorderTraversal(TreeNode* root) {
vector<int>result;
find_rl(root,result);
return result;
}
};
对于这个代码是我写完之后在旁边写的注释 可以更好地帮助理解
如果有什么疑问可以问 大家一起解决
#include <iostream>
#include <vector>
// Definition for a binary tree node.
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
class Solution {
public:
void traversal(TreeNode* cur, std::vector<int>& vec) {
if (cur == nullptr) return;
vec.push_back(cur->val); // 中
traversal(cur->left, vec); // 左
traversal(cur->right, vec); // 右
}
std::vector<int> preorderTraversal(TreeNode* root) {
std::vector<int> result;
traversal(root, result);
return result;
}
};
int main() {
// 创建二叉树
TreeNode* root = new TreeNode(1);
root->left = new TreeNode(2);
root->right = new TreeNode(3);
root->left->left = new TreeNode(4);
root->left->right = new TreeNode(5);
// 创建 Solution 对象
Solution solution;
// 执行前序遍历
std::vector<int> result = solution.preorderTraversal(root);
// 输出结果
std::cout << "Preorder Traversal: ";
for (int val : result) {
std::cout << val << " ";
}
std::cout << std::endl;
// 释放内存
delete root->left->left;
delete root->left->right;
delete root->left;
delete root->right;
delete root;
return 0;
}
前两个代码是递归方法
接下来是迭代方法
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int>result;
// stack<TreeNode>u; 这个地方一定注意 我们放入的是数!!!不是指针 所以不能这么写
stack<TreeNode*>u;
if(root==nullptr)
{
return result;
}
u.push(root);
while(!u.empty())
{
TreeNode*node=u.top();//注意看这个地方很特别 这个是一个指针来指向一个数
// result.push_back(u.top()); 这个地方这么写也有问题!!!
u.pop();
result.push_back(node->val);
if(node->left!=nullptr) u.push(node->left);//这么写才对
// result.push_back(node->right); 这个地方切记不是这么写的因为我们放入容器里面的是栈中的顶头
if(node->right!=nullptr)u.push(node->right);
}
reverse(result.begin(),result.end());//最后别忘记 反转
return result;
}
};