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

算法-二叉树篇02-二叉树的迭代遍历

二叉树的递归遍历

力扣题目链接-前序遍历
力扣题目链接-后序遍历
力扣题目链接-中序遍历

题目描述

给你二叉树的根节点,分别前序/后序/中序遍历输出节点。

算法描述

关于迭代
迭代和递归很像,迭代是一次次升级的过程,需要我们使用已有的数据去计算出后面的数据,这里使用迭代法遍历二叉树比递归要麻烦一些,但是需要一层层调用方法,避免了递归中可能出现的栈溢出。

解题思路

这里其实前序和后续比较简单,主要是中序遍历比较麻烦。

题解

前序遍历
class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> ans;
        stack<TreeNode*> st;
        if(root == nullptr){
            return ans;
        }
        st.push(root);

        while(!st.empty()){
            TreeNode* cur = st.top();
            ans.push_back(cur->val);
            st.pop();
            if(cur->right){
                st.push(cur->right);
            }
            if(cur->left){
                st.push(cur->left);
            }
        }

        return ans;
    }
};
后续遍历
class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> ans;
        if(root == nullptr){
            return ans;
        }

        stack<TreeNode*> st1;
        stack<int> st2;
        st1.push(root);
        while(!st1.empty()){
            TreeNode* cur = st1.top();
            st2.push(cur->val);
            st1.pop();
            if(cur->left){
                st1.push(cur->left);
            }
            if(cur->right){
                st1.push(cur->right);
            }
        }

        while(!st2.empty()){
            ans.push_back(st2.top());
            st2.pop();
        }

        return ans;
    }
};
中序遍历
class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> ans;
        if(root == nullptr){
            return ans;
        }
        stack<TreeNode*> st;
        TreeNode* cur = root;
        while(!st.empty() || cur != nullptr){
            if(cur != nullptr){
                st.push(cur);
                cur = cur->left;
            }
            else{
                cur = st.top();
                st.pop();
                ans.push_back(cur->val);
                cur = cur->right;
            }
        }

        return ans;
    }
};

相关文章:

  • 【leetcode hot 100 1】两数之和
  • el-date-picker 组件限制禁止选择当前时间之前的时间
  • 鸿蒙开发深入浅出04(首页数据渲染、搜索、Stack样式堆叠、Grid布局、shadow阴影)
  • 05. Springboot admin集成Actuator(一)
  • qt:多元素类,容器类,布局类
  • 大白话javascript如何通过原型链实现对象的继承,并指出这种继承方式的优缺点
  • JVM 高级面试题及答案整理,最新面试题
  • Win32/ C++ 简易对话框封装框架(多语言, 通知栏菜单, 拖拽文件处理)
  • Logback:强大的Java日志框架
  • 大模型面试问题准备
  • 【idea问题排查技巧】
  • C++中数学函数的使用方法
  • Python游戏编程之赛车游戏6-5
  • ESP32学习笔记_Bluetooth(3)——GATT
  • 计算机毕业设计SpringBoot+Vue.js足球青训俱乐部管理系统(源码+文档+PPT+讲解)
  • vue从入门到精通(十三):收集表单数据
  • [前端开发]vue-devtools6.5.0及历史版本下载
  • 【大模型系列篇】如何解决DeepSeek-R1结构化输出问题,使用PydanticAl和DeepSeek构建结构化Agent
  • 【够用就好006】-PC桌面管理ECS服务器的实操步骤
  • 20250212:https通信
  • 淘客网站怎么做首页/深圳网络营销策划有限公司
  • 2022年没封网站直接进入/电商网站制作
  • 做设计的素材网站/大同优化推广
  • 屯留做网站哪里好/seo的作用主要有
  • 空间平面的网页设计素材/电商seo搜索优化
  • wordpress搬家/东莞seo建站咨询