首页 > 其他分享 >详解二叉树的非递归遍历

详解二叉树的非递归遍历

时间:2024-10-10 15:19:00浏览次数:9  
标签:遍历 TreeNode current 详解 right 二叉树 null root stack

二叉树的非递归遍历:

二叉树的非递归遍历使用栈或队列自身功能(先进后出或先进先出)来实现。对于非常深的树,递归可能导致栈溢出错误,因为每次递归调用都会占用栈空间。非递归遍历使用显式的栈或队列,可以更好地控制内存使用,避免这种问题。

链表节点

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode() {}
    TreeNode(int x) { val = x; }
    TreeNode(int val, TreeNode left, TreeNode right) {
          this.val = val;
          this.left = left;
          this.right = right;
     }
}

以下写的几种方式都是非递归的(除了层次遍历用队列实现,其它都是用栈实现):
在这里插入图片描述

前序遍历

public class BinaryTree {
    public void preorderTraversal(TreeNode root) {
        if (root == null) return;
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while (!stack.isEmpty()) {
            TreeNode current = stack.pop();
            System.out.print(current.val + " ");
            if (current.right != null) {
                stack.push(current.right);
            }
            if (current.left != null) {
                stack.push(current.left);
            }
        }
    }
}

中序遍历

public class BinaryTree {
    public void inorderTraversal(TreeNode root) {
        Stack<TreeNode> stack = new Stack<>();
        TreeNode current = root;
        while (current != null || !stack.isEmpty()) {
            while (current != null) {
                stack.push(current);
                current = current.left;
            }
            current = stack.pop();
            System.out.print(current.val + " ");
            current = current.right;
        }
    }
}

后序遍历

public class BinaryTree {
    public void postorderTraversal(TreeNode root) {
        if (root == null) return;
        Stack<TreeNode> stack = new Stack<>();
        Stack<Integer> output = new Stack<>();
        stack.push(root);
        while (!stack.isEmpty()) {
            TreeNode current = stack.pop();
            output.push(current.val);
            if (current.left != null) {
                stack.push(current.left);
            }
            if (current.right != null) {
                stack.push(current.right);
            }
        }
        while (!output.isEmpty()) {
            System.out.print(output.pop() + " ");
        }
    }
}

在这里插入图片描述

层次遍历

 public List<List<Integer>> levelOrder(TreeNode root) {
        Queue<TreeNode> queue=new LinkedList<>();
        List<List<Integer>> list = new ArrayList<List<Integer>>();
        if (root == null)return list;
        if(root!=null)queue.add(root);
        while(!queue.isEmpty()){
            List<Integer> tmp=new ArrayList<>();
            for(int i=queue.size();i>0;i--){
                TreeNode node=queue.poll();
                tmp.add(node.val);
                if (node.left != null) queue.add(node.left);
                if (node.right != null) queue.add(node.right);
            }
            list.add(tmp);
        }
        return list;
    }

请大家不要忘记一键三连哟~~~
内容较少用了半个小时嘿嘿
如有不足请在评论区指出

标签:遍历,TreeNode,current,详解,right,二叉树,null,root,stack
From: https://blog.csdn.net/w287586/article/details/142821600

相关文章

  • 单片机复位详解
    单片机复位详解单片机复位介绍单片机复位是确保单片机能够稳定、正确地从头开始执行程序的重要机制。复位电路的作用是使单片机的状态处于初始化状态,包括让时钟处于稳定状态、各种寄存器和端口处于初始化状态等。单片机复位分为高电平复位和低电平复位两种方式。基本上所有单......
  • 高效美发店运营:SpringBoot管理系统详解
    1系统概述1.1研究背景随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理美发门店管理系统的相关信息成为必然。开发合适的美发门店管理系统,可以方便管理人员对美发......
  • 防止SQL攻击详解
    防止SQL注入攻击是保护数据库安全的重要一环。以下是一些有效的措施来防范SQL注入攻击:使用参数化查询或预编译语句:这是最推荐的方法,通过使用参数化查询(也称为预编译语句),可以确保用户输入的数据不会被解释为SQL代码。在大多数现代编程语言和数据库驱动程序中都支持这种方法。......
  • 「OC」NSArray的底层逻辑和遍历方法
    「OC」NSArray的底层逻辑和遍历方法文章目录「OC」NSArray的底层逻辑和遍历方法前言NSArray的底层逻辑占位符init后的空NSArray只有单个元素的NSArray大于一个元素的NSArray可变数组NSMutableArray总结图片遍历NSArray1.for循环2.枚举3.for—in4.多线程1.for循环&f......
  • uibot发送邮件:自动化邮件发送教程详解!
    uibot发送邮件的操作指南?uibot发送邮件的两种方式?在现代办公环境中,自动化流程的引入极大地提高了工作效率。uibot发送邮件功能成为了许多企业和个人实现邮件自动化发送的首选工具。AokSend将详细介绍如何使用uibot发送邮件。uibot发送邮件:准备工作确保您已经安装并配置好了......
  • OCR+PDF解析配套前端工具开源详解!
    面对日常生活和工作中常见的OCR识别、PDF解析、翻译、校对等场景,配套的可视化工具能够极大地提升我们的使用体验和工作效率。通过可视化界面,我们可以直观地看到文本识别、解析和翻译的结果,便捷评估产品效果。今天来跟大家分享一个非常棒的开源项目——TextInParseX-Frontend,帮......
  • docker详解介绍+基础操作 (三)
    1.docker存储引擎Overlay:一种UnionFS文件系统,Linux内核3.18后支持Overlay2:Overlay的升级版,docker的默认存储引擎,需要磁盘分区支持d-type功能,因此需要系统磁盘的额外支持。关于d-type传送门 docker详解介绍+基础操作(二)-CSDN博客由于centos8及ubuntu1604版本均支持,其......
  • USB协议详解第12讲(USB传输-初探)
    1.USB传输、事务、包的关系USB传输、事务、包是从不同层次上去说明一次数据交互的三个概念。举个例子可能更好些,"某领导和一个早起的程序员进行了一次交流,说了5件事"。OK,其实这里的"这次交流"就相当于USB的一次传输,"说了5件事"就相当于这次传输过程中的5个事务,当然每件事肯定有......
  • PasteForm最佳CRUD实践,实际案例PasteTemplate详解之3000问(四)
    无论100个表还是30个表,在使用PasteForm模式的时候,管理端的页面是一样的,大概4个页面,利用不同操作模式下的不同dto数据模型,通过后端修改对应的dto可以做到控制前端的UI,在没有特别特殊的需求下可以做到快速的实现CRUD!免去版本兼容问题,免去前后端不一致的问题,免去样式不一的问题!基......
  • USB协议详解第11讲(USB描述符-总结)
    描述符回顾总结1.其实所有的描述符都是USB设备用来描述自己属性及用途的,所以必须在设备端实现对应的描述符,主机会在枚举此设备的时候根据设备实现的描述符去确定设备到底是一个什么样的设备、设备需要的总线资源、和设备的通讯方式等等。2.每一个USB设备只有一个设备描述符,主要......