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

相关文章:

  • 【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通信
  • 网络基础I
  • Python游戏编程之赛车游戏6-4
  • **模式的好处 (设计模式)
  • ArcGIS Pro中创建最低成本路径的详尽教程
  • 科普:HTTP端口80和HTTPS端口443
  • 浅谈 Redis 主从集群原理(一)
  • Figure自研模型Helix发布,人形机器人迈向新纪元?
  • 《一起打怪兽吧》——自制一款Python小游戏
  • 一文讲解Redis中的数据一致性问题
  • Linux红帽:RHCSA认证知识讲解(二)配置网络与登录本地远程Linux主机