当前位置: 首页 > news >正文

力扣144. 二叉树的前序遍历145. 二叉树的后序遍历94. 二叉树的中序遍历(非递归版)

前序遍历

/**
 * 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:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> result;
        stack<TreeNode*> st;
        st.push(root);
        while(!st.empty()) {
            TreeNode* node = st.top();
            st.pop();
            if(node != nullptr) result.push_back(node->val);
            else continue;
            st.push(node->right);
            st.push(node->left);
        }

        return result;
    }
};

后序遍历
这里的思路是交换了

			st.push(node->right);
            st.push(node->left);

的顺序,从先序列遍历的根左右变成了根右左,接着通过reverse变成了左右根,即后序遍历。

/**
 * 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:
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> result;
        stack<TreeNode*> st;
        st.push(root);
        while(!st.empty()) {
            TreeNode* node = st.top();
            st.pop();
            if(node != nullptr) result.push_back(node->val);
            else continue;
            st.push(node->left);
            st.push(node->right);
        }
        reverse(result.begin(), result.end());

        return result;
    }
};

中序遍历
写法一:

/**
 * 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:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> result;
        stack<TreeNode*> st;
        TreeNode* cur = root;
        while (cur != nullptr || !st.empty()) {
            if(cur != nullptr) {
                st.push(cur);
                cur = cur->left;
            } else {
                cur = st.top();
                st.pop();
                result.push_back(cur->val);
                cur = cur->right;
            }
        }

        return result;
    }
};

写法二:

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> result;
        stack<TreeNode*> st;
        TreeNode* node = root;

        while (node || !st.empty()) {  // 遍历整个树
            while (node) {             // 先遍历到最左
                st.push(node);
                node = node->left;
            }
            node = st.top();
            st.pop();
            result.push_back(node->val);
            node = node->right;  // 进入右子树
        }
        
        return result;
    }
};

相关文章:

  • Redis的基础使用
  • (8/100)每日小游戏平台系列
  • vscode插件开发
  • 50道题快速复习MySQL之准备篇
  • Unity截取RenderTexture某帧画面显示在Image上
  • 装多系统踩的坑
  • Unity中可靠的UDP实现
  • 三层渗透测试-DMZ区域 二三层设备区域
  • Redis 过期键(expires)机制详解
  • 【个人开发】deepspeed+Llama-factory 本地数据多卡Lora微调【完整教程】
  • 2025三掌柜赠书活动第五期:Elasticsearch实战(第2版)
  • 250217-数据结构
  • Jetson Agx Orin平台JP6.0-r36.3版本修复了vi模式下的原始图像损坏(线条伪影)
  • DeepSeek等大模型功能集成到WPS中的详细步骤
  • 【javascript】录音可视化
  • C++反转字符串
  • Android MVC、MVP、MVVM、MVI的架构的区别
  • numpy库
  • 基于若依开发的工程项目管理系统开源免费,用于工程项目投标、进度及成本管理的OA 办公开源系统,非常出色!
  • spring boot知识点1
  • 上海天文馆走进徐家汇书院,XR沉浸式天文科普体验再推力作
  • 辽宁援疆前指总指挥王敬华已任新疆塔城地委副书记
  • 湖南4个县市区被确定为野生蘑菇中毒高风险区:中毒尚无特效解毒药
  • 韶关一企业将消防安装工程肢解发包,广东住建厅:罚款逾五万
  • 老字号“逆生长”,上海制造的出海“蜜”钥
  • 最高检公布一起离婚纠纷典型案例:推动离婚经济补偿制度落实