C++实现二叉树的前序遍历和后序遍历(递归)

前序遍历:首先访问根结点,然后遍历左子树,最后遍历右子树(根->左->右)

顺序:访问根节点->左子树->右子树
在这里插入图片描述

递归方法

/**
 * Definition for a binary tree node.
 * 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:
    void preorder(TreeNode *root,vector<int> &ret){
        if(root==nullptr)
            return ;
         //根->左->右
        ret.push_back(root->val);
        preorder(root->left,ret);
        preorder(root->right,ret);
    }
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> ret;
        //使用引用的方式传递值
        preorder(root,ret);
        return ret;
    }
};

后序遍历

与前序遍历相反,遍历方式:左子树 —> 右子树 —> 根结点

/**
 * Definition for a binary tree node.
 * 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:
    void postorder(TreeNode* root,vector<int> &ret){
        if(!root) return ;
        postorder(root->left,ret);
        postorder(root->right,ret);
        ret.push_back(root->val);
    }
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> ret;
        postorder(root,ret);
        return ret;
    }
};
### C++ 实现树的前序遍历后序遍历C++中,可以通过定义一个二叉树结构并编写递归函数来实现前序遍历后序遍历。以下是具体的代码示例: #### 定义二叉树节点结构 首先需要定义一个表示二叉树节点的数据结构 `TreeNode`。 ```cpp struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} }; ``` #### 前序遍历 (Preorder Traversal) 前序遍历按照 **根 -> 左子树 -> 右子树** 的顺序访问节点。可以使用递归实现此功能。 ```cpp void preorderTraversal(TreeNode* root, std::vector<int>& result) { if (!root) return; // 如果当前节点为空,则返回 result.push_back(root->val); // 访问根节点 preorderTraversal(root->left, result); // 遍历左子树 preorderTraversal(root->right, result); // 遍历右子树 } ``` 调用上述方法时,需传递一个空向量用于存储结果。 #### 后序遍历 (Postorder Traversal) 后序遍历按照 **左子树 -> 右子树 -> 根** 的顺序访问节点。同样可以使用递归实现。 ```cpp void postorderTraversal(TreeNode* root, std::vector<int>& result) { if (!root) return; // 如果当前节点为空,则返回 postorderTraversal(root->left, result); // 遍历左子树 postorderTraversal(root->right, result); // 遍历右子树 result.push_back(root->val); // 访问根节点 } ``` 完整的程序如下所示: ```cpp #include <iostream> #include <vector> using namespace std; // 定义二叉树节点结构 struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} }; // 前序遍历函数 void preorderTraversal(TreeNode* root, vector<int>& result) { if (!root) return; result.push_back(root->val); preorderTraversal(root->left, result); preorderTraversal(root->right, result); } // 后序遍历函数 void postorderTraversal(TreeNode* root, vector<int>& result) { if (!root) return; postorderTraversal(root->left, result); postorderTraversal(root->right, result); result.push_back(root->val); } int main() { // 构建测试用的二叉树 /* 1 / \ 2 3 / \ 4 5 */ 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); // 执行前序遍历 vector<int> preResult; preorderTraversal(root, preResult); cout << "前序遍历: "; for (auto num : preResult) cout << num << " "; // 输出应为:1 2 4 5 3 cout << endl; // 执行后序遍历 vector<int> postResult; postorderTraversal(root, postResult); cout << "后序遍历: "; for (auto num : postResult) cout << num << " "; // 输出应为:4 5 2 3 1 cout << endl; return 0; } ``` 以上代码实现了基于给定二叉树前序遍历后序遍历[^1][^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SOC罗三炮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值