当前位置: 首页 > 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;
    }
};
http://www.dtcms.com/a/23764.html

相关文章:

  • 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
  • matlab 三维时频图绘制
  • 蓝桥杯篇---IAP15F2K61S2矩阵键盘
  • js第八题
  • 算法——结合实例了解Minimax算法(极小化极大算法)
  • 【C++】stack 和 queue 的适配器模式与实现
  • mysql 使用 CONCAT、GROUP_CONCAT 嵌套查询出 json 格式数据
  • javacv将mp4视频切分为m3u8视频并播放
  • 前端【技术方案】重构项目
  • Vue 3 中,Pinia 和 Vuex 的主要区别
  • blender骨骼分层问题:某一层的骨骼怎么移动到第一层