• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
MKT-porter
博客园    首页    新随笔    联系   管理    订阅  订阅
二叉树的中序遍历- 递归和栈

 

image

 

 

/**
 * 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:
    
    // // 初始化
    // struck TreeNode{
    //     int val;
    //     TreeNode *left;
    //     TreeNode *right;
    //     TreeNode(int x): val(x),left(nullptr),right(nullprt){}
    //     TreeNode(int x,TreeNode *left,TreeNode *right):val(x),left(left),right(right){}
    // }
    
    // // 创建
    // TreeNode* CreateTree(){
    //     TreeNode* root =new TreeNode(1);
    //     root->left = new TreeNode(11);
    //     root->right = new TreeNode(12);
    //     root->left->left = new TreeNode(21);
    //     root->left->right = new TreeNode(21);
    // }

    /*
    
     A
    / \
   B   C
  / \   \
 D   E   F


前序遍历: 根 → 左 → 右
前序遍历结果:A → B → D → E → C → F
应用场景​​:
复制二叉树结构
计算前缀表达式(波兰表示法)
序列化二叉树


中历顺序​​:左子树 → 根节点 → 右子树
中序遍历结果:D → B → E → A → C → F
应用场景​​:
二叉搜索树(BST)的有序遍历
中缀表达式求值
按顺序打印树的内容


遍历顺序​​:左子树 → 右子树 → 根节点
后序遍历结果:D → E → B → F → C → A
应用场景​​:
删除二叉树(先删除子节点再删除父节点)
计算后缀表达式(逆波兰表示法)
计算目录大小(先计算子目录大小)


    */
    // 方法一:递归
    void inorder(TreeNode* node_,vector<int> &result){
       if(node_ == nullptr) return ;
        inorder(node_->left,result);
        cout<<"节点 " << node_->val <<endl;
        result.push_back(node_->val);
        inorder(node_->right,result);
    }
    //方法一:递归 递归的时候隐式地维护了一个栈
    vector<int> inorderTraversal_1(TreeNode* root) {
        vector<int> result;
        inorder(root,result);
        return result;
    }


    vector<int> inorderTraversal(TreeNode* root) {
    
        stack<TreeNode*> s;
        vector<int> result;
        TreeNode* curr = root;
        while(curr !=nullptr || !s.empty()){
            while(curr !=nullptr) {
                s.push(curr);
                curr=curr->left;
            }
            curr = s.top();
            s.pop();
            result.push_back(curr->val);
            curr=curr->right;
        }
        return result;
    }

};

  

posted on 2025-10-21 21:26  MKT-porter  阅读(4)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3