二叉树遍历:递归 + 非递归 (Java)

二叉树的非递归遍历:Java语言实现 1 前言       上一篇写了《二叉树的递归遍历:Java语言实现》,现在用java实现下二叉树的非递归遍历。2 二叉树的非递归遍历2.1 先序遍历       根据前序遍历访问的顺序,优先访问根结点,然后再分别访问左孩子和右孩子。即对于任一结点,其可看做是根结点,因此可以直接访问。访问完之后,若其左孩子不为空,按相同规则访问它的左子树;当访问其左子树时,再访问它的右子树。因此其处理过程如下:对... 阅读详情
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

public class Tree {
    class TreeNode {
        public TreeNode left;
        public TreeNode right;
        public int value;

        public TreeNode(int v) {
            value = v;
            left = null;
            right = null;
        }
    }


    private void preOrder(TreeNode root) {
        if (root == null) return;

        System.out.print(root.value + " ");
        preOrder(root.left);
        preOrder(root.right);
    }

    private void preOrderLoop(TreeNode root) {
        if (root == null) return;

        Stack<TreeNode> help = new Stack<TreeNode>();
        help.add(root);

        TreeNode current;
        while (!help.isEmpty()) {
            current = help.pop();
            System.out.print(current.value + " ");

            if (current.right != null) help.add(current.right);
            if (current.left != null) help.add(current.left);
        }
    }


    private void inOrder(TreeNode root) {
        if (root == null) return;

        inOrder(root.left);
        System.out.print(root.value + " ");
        inOrder(root.right);
    }

    private void inOrderLoop(TreeNode root) {
        if (root == null) return;
        Stack<TreeNode> help = new Stack<TreeNode>();

        TreeNode current = root;
        while (!help.isEmpty() || current != null) {
            while (current != null) {
                help.add(current);
                current = current.left;
            }

            current = help.pop();
            System.out.print(current.value + " ");

            current = current.right;
        }
    }


    private void postOrder(TreeNode root) {
        if (root == null) return;

        postOrder(root.left);
        postOrder(root.right);
        System.out.print(root.value + " ");
    }

    private void postOrderLoop(TreeNode root) {
        if (root == null) return;
        Stack<TreeNode> help = new Stack<TreeNode>();
        Stack<TreeNode> result = new Stack<TreeNode>();

        help.add(root);

        TreeNode current;
        while (!help.isEmpty()) {
            current = help.pop();
            result.add(current);
            if (current.left != null) help.add(current.left);
            if (current.right != null) help.add(current.right);
        }

        while (!result.isEmpty()) {
            System.out.print(result.pop().value + " ");
        }
    }


    private void levelOrderLoop(TreeNode root) {
        if (root == null) return;

        Queue<TreeNode> help = new LinkedList<TreeNode>();
        help.add(root);

        TreeNode current;
        while (!help.isEmpty()) {
            current = help.poll();
            System.out.print(current.value + " ");

            if (current.left != null) help.add(current.left);
            if (current.right != null) help.add(current.right);
        }
    }

    public void test() {
        TreeNode root = new TreeNode(1);
        TreeNode node1 = new TreeNode(2);
        TreeNode node2 = new TreeNode(3);
        TreeNode node3 = new TreeNode(4);
        TreeNode node4 = new TreeNode(5);
        TreeNode node5 = new TreeNode(6);

        root.left = node3;
        node3.left = node2;
        node3.right = node4;
        root.right = node1;
        node1.right = node5;

        System.out.print("preOrder: ");
        preOrder(root);
        System.out.println();
        System.out.print("preOrderLoop: ");
        preOrderLoop(root);
        System.out.println();
        System.out.print("inOrder: ");
        inOrder(root);
        System.out.println();
        System.out.print("inOrderLoop: ");
        inOrderLoop(root);
        System.out.println();
        System.out.print("postOrder: ");
        postOrder(root);
        System.out.println();
        System.out.print("postOrderLoop: ");
        postOrderLoop(root);
        System.out.println();
        System.out.print("levelOrderLoop: ");
        levelOrderLoop(root);
        System.out.println();
    }
}

DA14531-外设驱动篇-UART收发通信应用 宏定义注解CFG_PRINTF用户开启串口串口打印宏设置波特率选择115200。 阅读详情

相关推荐

Win10插网线显示未识别网络的三种解决方法

本文介绍了三种解决Win10插网线显示未识别网络问题的方法:更新或重启网络设备驱动程序、重置Winsock目录、启用Network Setup Service服务。这些方法都是基于常见的网络问题和解决方案而设计的,适用于大多数Win10用户。如果你遇到了这一问题,可以按照上述步骤进行操作,相信一定能够找到解决问题的方法。需要注意的是,在进行任何操作之前,请务必备份重要数据以防万一。此外,如果你对计算机硬件或软件不熟悉,建议寻求专业人士的帮助以避免造成不必要的损失。

nntxthml的博客 6770

Java二叉树三序遍历的非递归实现

Java二叉树三序遍历的非递归实现

2301_79698279的博客 2104

告别仿真失败!用Sigrity 2022 SystemSI搞定DDR4信号质量仿真的保姆级流程

本文详细介绍了如何使用Sigrity 2022 SystemSI工具进行DDR4信号完整性仿真,提供了一套避免仿真失败、提高仿真精度和加速仿真流程的保姆级方法。从模型验证、设计数据预处理到拓扑构建和参数提取,再到高级调试技巧和仿真加速方案,帮助硬件工程师系统性地解决DDR4信号质量仿真中的常见问题。

weixin_42537499的博客 341

java实现二叉树的遍历(递归和非递归)

现有一颗如下图所示的二叉树: 其遍历的各种方式如下: 构造一颗如下图所示的二叉树,用java实现其前序,中序,后序遍历 注意二叉树节点的定义如下: public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val =...

FREEMAN 4万+

FDTD材料nk值拟合优化指南:利用材料资源管理器提升光学模型精度

本文详细介绍了如何利用FDTD仿真软件中的材料资源管理器,对材料nk值进行精确拟合与优化,从而提升光学模型的仿真精度。文章通过实战案例,解析了拟合参数调整、报告解读以及针对varFDTD求解器的特殊注意事项,帮助用户从根本上解决仿真结果不准的常见问题。

weixin_29196891的博客 352

SAP COPA实战:手把手教你用CMOD增强搞定自定义特性派生(以客户字段为例)

本文详细介绍了在SAP COPA模块中通过CMOD增强实现自定义特性派生的全流程,以客户字段为例,展示了从特性设计、SPRO配置到特性派生逻辑实现的完整步骤。重点讲解了如何利用CMOD增强技术解决业务需求,提升获利能力段分析的灵活性和准确性。

weixin_30275415的博客 428

java实现二叉树树的非递归遍历

二叉树递归 参考:java使用递归,非递归方式实现二叉树的三种常见遍历方式 代码实现 Node类 public class Node { int data; Node leftChild = null; Node rightChild = null; public Node(int data) { this.data = data; }...

weixin_41826973的博客 855

JavaFX - 动画

JavaFX 动画

思你日度难眠 1601

树、二叉树的前中后层序遍历(递归、非递归Java实现)

文章目录1. 二叉树的前中后序遍历(递归,非递归)以及层序遍历1.1 二叉树前中后遍历的递归解法1.2 二叉树前中后遍历的非递归解法1.2.1 非递归的前序遍历:(LeetCode 144)1.2.2 非递归的中序遍历:(LeetCode 94)1.2.3 非递归的后序遍历:(LeetCode 145)1.3 层序遍历:(LeetCode 102、103、107)2 树的前中后层序遍历2.1 前序...

卤小蛋学编程 5077

使用 Wireshark 进行计算机网络协议分析

文章目录实验前准备一、Wireshark抓包示例二、Wireshark实作1、数据链路层实作一 熟悉Ethernet帧结构实作二 了解子网内/外通信时的 MAC 地址实作三 掌握 ARP 解析过程2、网络层实作一 熟悉 IP 包结构实作二 IP 包的分段与重组实作三 考察 TTL 事件3、传输层实作一 熟悉 TCP 和 UDP 段结构实作二 分析 TCP 建立和释放连接4、应用层实作一 了解 DNS 解析实作二 了解 HTTP 的请求和应答 实验前准备 本部分实验用到的是抓包和协议分析软件——Wiresha

weixin_51087836的博客 8199

控制算法研发工程师(博士)职位深度解析与面试指南

摘要:广东万和新电气股份有限公司招聘控制算法研发工程师(博士),工作地点佛山顺德。职位要求2026届博士学历,电子信息工程或控制科学与工程专业。主要职责包括:1)燃气热水、热泵等系统的电控软件设计与优化;2)开发PID、模糊控制、ADRC、MPC等智能算法,应用于恒温控制、变频调节等场景。重点考察算法研发能力、系统稳定性优化及嵌入式实现经验。该职位提供三年资深工程师培养计划,需具备扎实的控制理论基础和工程实践能力,能够处理非线性系统、多工况自适应等复杂控制问题。

郑伟强dev的专栏 139

先中后序遍历二叉树(递归、非递归)(Java)

思路: 递归、非递归两种方式,递归、非递归遍历二叉树 代码: package com.my.test.datastructure.tree; import java.util.Stack; /** * 先中后序遍历二叉树(递归、非递归) */ public class BinaryTreeVisit { static class Node { int...

聚沙成塔 4944

YOLO11涨点优化:Loss魔改 | WIoU (Wise-IoU) v3版本全面替换,基于动态非单调聚焦机制,让模型更聪明地学习

YOLOv11目标检测中的WIoU v3损失函数改进 本文探讨了YOLOv11目标检测模型中CIoU损失函数的局限性,并提出了WIoU v3改进方案。关键发现包括: CIoU的缺陷:在低质量样本(小目标/遮挡目标)上过度惩罚,导致模型优化方向偏离,小目标AP往往比大目标低30%左右。 WIoU v3的创新: 动态非单调聚焦机制:根据样本"离群度"智能分配梯度 让模型重点优化中等质量样本,减少对低质量样本的无效关注 采用指数移动平均来自适应调整质量评判标准 实际效果:WIoU v3在保持大

2601_95807009的博客 421

非递归遍历二叉树 Java

非递归实现二叉树的前序遍历 ```public List&lt;Integer&gt; preorderTraversal(TreeNode root) { List&lt;Integer&gt; ret = new ArrayList&lt;&gt;(); Stack&lt;TreeNode&gt; stack = new Stack&lt;&gt;(); stack....

小胖的博客 1753

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

二叉树非递归遍历算法 java_java二叉树的非递归遍历

二叉树的递归遍历比较简单,这里就不聊了。今天主要聊聊二叉树的非递归遍历,主要借助于“栈”后进先出的特性来保存节点的顺序,先序遍历和中序遍历相对来说比较简单,重点理解后序遍历。1. 先看看节点类型://二叉树的节点类型private class Node{int data; //节点值Node leftChild; //左孩子Node rightChild; //右孩子public Node(int...

weixin_39915308的博客 704

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

二叉树的非递归遍历(Java实现)

首先先将头节点入栈。之后不断判断栈中是否为空,不为空就将栈顶元素弹出,打印节点的值。然后将弹出节点的右节点先入栈,左节点后入栈。(注意不为空时才入栈)

Wood_Like的博客 1102

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java 二叉树前序遍历(递归/非递归)

Java 二叉树前序遍历(递归/非递归)

tracy的博客 1651

java树的非递归遍历_java二叉树的非递归遍历

二叉树的递归遍历比较简单,这里就不聊了。今天主要聊聊二叉树的非递归遍历,主要借助于“栈”后进先出的特性来保存节点的顺序,先序遍历和中序遍历相对来说比较简单,重点理解后序遍历。1. 先看看节点类型://二叉树的节点类型private class node{int data; //节点值node leftchild; //左孩子node rightchild; //右孩子public node(int...

weixin_35728532的博客 454

Java递归、非递归实现二叉树遍历

最近找工作做笔试题发现很重要,就自己写了一点,和大家分享 import java.util.Stack;import java.util.HashMap;public class BinTree { private char date; private BinTree lchild; private BinTree rchild; public BinTre

2528

java 二叉树,非递归遍历

绝大多数可以用递归解决的问题,其实都可以用另一种数据结构来解决,这种数据结构就是栈。 因为递归和栈都有回溯的特性。 如何借助栈来实现二叉树的非递归遍历呢?下面以二叉树的前序遍历为例,看一看具体过程。 1.首先遍历二叉树的根节点1,放入栈中。 2.遍历根节点1的左孩子节点2,放入栈中 3.遍历节点2的左孩子节点4,放入栈中。 4.节点4既没有左孩子,也没有右孩子,我们需要回溯到上一个节点2。可是现在并不是做递归操作,怎么回溯呢? 别担心,栈已经存储

huihuimm的博客 388

Java 二叉树非递归遍历核心实现

非递归遍历的核心是,通过手动维护栈来替代系统栈,实现前序、中序和后序遍历。

肢解生活,直达本质;凡所有相,皆是虚妄。 692

Java实现二叉树的三种非递归遍历

Java 实现二叉树的三种非递归遍历1.思路 其实思路就是递归的思路,无非就是加入了栈这个数据结构。 具体来看代码吧,个人觉得还算简洁。 2.实现首先是结点数据结构的设置:/** * @author WK */ public class SearchBinaryTree { //存放的结点标志 public String tag = ""; //是否被便利的标

优快云OfWK的博客 1109

java 二叉树的遍历 递归非递归

二叉树遍历首先弄清遍历流程。 中序遍历:第一次经过从它找左,第二次经过找右,第三次经过回来。第二次经过访问它。 算法实现: 第二次访问是 pop(&S,&p);Visit(p->data);因为中序遍历跟第三次经过没关系。所以第二次就弹出栈了。 Java版的程序如下: [java] view plain copy package 

狂奔的蜗牛 304

java二叉树创建层序创建,遍历(递归,非递归版)

使用队列工具 进行二叉树层序创建 后再补充二叉树先序创建,和 二叉树后序非递归遍历 有问题的,或者有更好的实现方式,欢迎指正!!! class TNode<E>; //结点信息 createBiTree(char[] array); //层序创建二叉树 GetHeight(TNode BT); //求树高 boolean isEmpty(TNode root); //二叉判空...

WDC的博客 685

小白的二叉树非递归遍历(java)

如果要用非递归的手法,我们要用到栈的相关知识,我们使用一个栈来保存节点,从根节点root开始将剩下节点以先右后左的顺序依次入栈,并进入循环,直到节点为null时说明该子树(左,右)已经遍历完毕。弹出栈顶节点 node并输出,如果 node 的右子节点不为空,则将右子节点入栈,如果 node 的左子节点不为空,则将左子节点入栈。先将根节点入第一个栈,然后不断地将节点弹出并压入第二个栈,同时将左右子节点依次入栈,最后将第二个栈中的节点依次弹出,就是后序遍历。以下将由前序开始发表我的思考。

weixin_74129497的博客 405

二叉树遍历的非递归Java实现

二叉树遍历的非递归Java实现

iFleetingtime的博客 506
上一篇: 如何利用C#在内存中生成zip文件并保存
下一篇: 从前序遍历和中序遍历构造二叉树(Java)
lxf310
博客等级 码龄17年 26粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值