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

代码随想录刷题day35|(二叉树篇)二叉树的非递归遍历(前序+后序)

目录

一、二叉树理论基础

二、非递归遍历思路

三、相关算法题目

四、总结


一、二叉树理论基础

详见:代码随想录刷题day34|(二叉树篇)二叉树的递归遍历-CSDN博客

二、非递归遍历思路

通过栈来模拟递归的过程。递归的本质是函数调用栈,而非递归方法则是显式地使用栈来保存待处理的节点;

初始化一个栈保存待处理的节点,初始化一个list,用来保存遍历结果,首先将根节点压入栈,之后重复以下过程:栈非空,栈顶元素出栈,添加进list,然后将出栈节点的右节点压入栈、左节点压入栈;当栈为空,说明所有节点处理完毕;

注:由于栈的先进后出,而前序遍历的顺序是中左右,所以要先压入右节点,再压入左节点,这样左节点可以先出栈;

后序遍历:左右中

前序遍历是:中左右,在前序遍历中,先将左节点压入栈,再将右节点压入栈,这样得到:中右左;最后将list反转,得到:左右中 ---> 后序遍历

三、相关算法题目

144.二叉树的前序遍历

class Solution {
    //非递归遍历
    public List<Integer> preorderTraversal(TreeNode root) {
        //迭代法
        Deque<TreeNode> deque = new ArrayDeque<>();
        List<Integer> list = new ArrayList<>();
        //deque.push(root);
        if(root == null){
            return list;
        }
        deque.push(root);
        while(!deque.isEmpty()){
            //list.add(deque.pop().val);
            TreeNode node = deque.pop(); //出栈
            list.add(node.val); //添加进list
            //添加右孩子 添加左孩子
            if(node.right != null){
                deque.push(node.right);
            }
            if(node.left != null){
                deque.push(node.left);
            }
        }
        return list;     
    }
}

 145.二叉树的后序遍历

class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        //非递归遍历
        List<Integer> list = new ArrayList<>();
        Deque<TreeNode> deque = new ArrayDeque<>();
        if(root == null){
            return list;
        }
        deque.push(root);
        while(!deque.isEmpty()){
            TreeNode node = deque.pop();
            list.add(node.val);
            if(node.left != null){//先处理左节点
                deque.push(node.left);
            }
            if(node.right != null){//再处理右节点
                deque.push(node.right);
            }
        }
        //reverse(list, 0, list.size() - 1);
        Collections.reverse(list);//将列表反转
        return list;//得到后序遍历
    }
}

四、总结

1.前序遍历中注意先将右子树压入栈,再压入左子树;

2.后序遍历如何在前序遍历的基础上得到;

3.list集合反转有方法直接用,Collections.reverse(list);

相关文章:

  • 解决各大浏览器中http地址无权限调用麦克风摄像头问题(包括谷歌,Edge,360,火狐)后续会陆续补充
  • Mac mini M4安装nvm 和node
  • 化学工业领域 - 基础化工、精细化工、煤化工极简理解
  • (十一)基于vue3+mapbox-GL实现模拟高德实时导航轨迹播放
  • REACT学习第三幕--沉睡花园
  • Pseudo-Q: Generating Pseudo Language Queries for Visual Grounding
  • Java类加载机制 双亲委派机制 八股速记版
  • 网络配置的基本信息
  • MFC中CMutex类和CSingleLock类,配合使用疑惑
  • windows电脑上安装llama-factory实现大模型微调
  • 校园订餐微信小程序(全套)
  • CSS定位详解
  • 一键安装Mysql部署脚本之Linux在线安装Mysql,脚本化自动化执行服务器部署(附执行脚本下载)
  • 【Linux】进程退出 | 初始缓冲区 | 子进程回收(六)
  • PE文件结构详解(DOS头/NT头/节表/导入表)使用010 Editor手动解析notepad++.exe的PE结构
  • 泛微数智大脑Xiaoe.AI产品体验大会全国巡展,即将启航,诚邀现场体验
  • 【开源免费】基于SpringBoot+Vue.JS酒店管理系统(JAVA毕业设计)
  • 使用python运行网格世界环境下 TD算法
  • DeepSeek学习规划
  • 智能座舱介绍
  • 调查丨永久基本农田沦为垃圾堆场,整改为何成“纸面工程”?
  • 关税影响下沃尔玛想涨价,特朗普施压:自行承担,别转嫁给顾客
  • 广西北流出现强降雨,1人被洪水冲走已无生命体征
  • 哪条线路客流最大?哪个站点早高峰人最多?上海地铁一季度客流报告出炉
  • 牛市早报|持续推进城市更新行动意见印发,证监会强化上市公司募资监管
  • 严打金融黑灰产,今年来上海警方破获各类经济犯罪案件690余起