`

JAVA语言实现二叉树的层次遍历的非递归算法及递归算法

阅读更多
总则:
1.二叉树遍历:逻辑、具体算法理解即可,不必自己写出来. //太复杂了.
2.整理理解:

原文参考:http://blog.csdn.net/oney139/article/details/8063953
二叉树遍历 BinTree
package edu.yhf.demo.binaryTree;

import java.util.Stack;

/**
 *  二叉树遍历
 * @author lengzl
 * @email 819681951@qq.com
 * @create 2017年2月9日 下午3:20:02
 * 原文参考:http://blog.csdn.net/oney139/article/details/8063953
 */
public class BinTree {
    protected BTNode root;
    public BinTree(BTNode root) {
        this.root = root;
    }
    public BTNode getRoot() {
        return root;
    }
    /** 构造树I
      	H
      / \
      D  G
     / \  \
    B  C   F
     \	  /
     A	 E
     * @author lengzl
     * @email 819681951@qq.com
     * @create 2017年2月9日 上午9:39:00
     * @return
     */
     
    public static BTNode init() {
    	/*
        BTNode a = new BTNode('A');
        BTNode b = new BTNode('B', null, a);
        BTNode c = new BTNode('C');
        BTNode d = new BTNode('D', b, c);
        BTNode e = new BTNode('E');
        BTNode f = new BTNode('F', e, null);
        BTNode g = new BTNode('G', null, f);
        BTNode h = new BTNode('H', d, g); //根节点
        BTNode
        */
     /** 构造树II
       A
      / \
      B  C
     / \  \
    D  E   F
      /   / \
     G   N  I
    /	 \
   J	  K
   
     */
    	/*
    	 * 左边树
    	 */
    	BTNode j = new BTNode('J');
    	BTNode g = new BTNode('G',j,null);
    	BTNode e = new BTNode('E',g,null);
    	BTNode d = new BTNode('D');
    	BTNode b = new BTNode('B',d,e);
    	
    	/*
    	 * 右边树
    	 */
    	BTNode k = new BTNode('K');
    	BTNode n = new BTNode('N',null,k);
    	BTNode i = new BTNode('I');
    	BTNode f = new BTNode('F',n,i);
    	BTNode c = new BTNode('C',null,f);
    	BTNode h = new BTNode('A',b,c);
    	
        return h;// root
    }
    /**
     *  访问节点,打印操作
     * @author lengzl
     * @email 819681951@qq.com
     * @create 2017年2月9日 下午3:19:50
     * @param p
     */
    public static void visit(BTNode p) {
        System.out.print(p.getKey() + " ");
    }
    /** 递归实现前序遍历 */
    protected static void preorder(BTNode p) {
        if (p != null) {
            visit(p); //只是打印值
            preorder(p.getLeft());
            preorder(p.getRight());
        }
    }
    /** 递归实现中序遍历 */
    protected static void inorder(BTNode p) {
        if (p != null) {
            inorder(p.getLeft());
            visit(p);
            inorder(p.getRight());
        }
    }
    /** 递归实现后序遍历 */
    protected static void postorder(BTNode p) {
        if (p != null) {
            postorder(p.getLeft());
            postorder(p.getRight());
            visit(p);
        } 
    }
    /** 非递归实现前序遍历 */
    protected static void iterativePreorder(BTNode p) {
        Stack<BTNode> stack = new Stack<BTNode>();
        if (p != null) {
            stack.push(p);
            while (!stack.empty()) {
                p = stack.pop();
                visit(p);
                if (p.getRight() != null)
                    stack.push(p.getRight());
                if (p.getLeft() != null)
                    stack.push(p.getLeft());
            }
        }
    }
    /** 非递归实现后序遍历 */
    protected static void iterativePostorder(BTNode p) {
        BTNode q = p;
        Stack<BTNode> stack = new Stack<BTNode>();
        while (p != null) {
            // 左子树入栈
            for (; p.getLeft() != null; p = p.getLeft())
                stack.push(p);
            // 当前节点无右子或右子已经输出
            while (p != null && (p.getRight() == null || p.getRight() == q)) {
                visit(p);
                q = p;// 记录上一个已输出节点
                if (stack.empty())
                    return;
                p = stack.pop();
            }
            // 处理右子
            stack.push(p);
            p = p.getRight();
        }
    }
    /** 
     * 非递归实现中序遍历
     * 左-右-根
     * @author lengzl
     * @email 819681951@qq.com
     * @create 2017年2月9日 下午4:59:19
     * @param p
     */
    protected static void iterativeInorder(BTNode p) {
        Stack<BTNode> stack = new Stack<BTNode>();
        while (p != null) {
            while (p != null) {
                if (p.getRight() != null)
                    stack.push(p.getRight());// 当前节点右子入栈
                stack.push(p);// 当前节点入栈
                p = p.getLeft();
            }
            p = stack.pop();
            while (!stack.empty() && p.getRight() == null) {
                visit(p);
                p = stack.pop();
            }
            visit(p);
            if (!stack.empty())
                p = stack.pop();
            else
                p = null;
        }
    }
    public static void main(String[] args) {
    	//构造树
        BinTree tree = new BinTree(init());
        System.out.print("(前序排列)Pre-Order:");
        preorder(tree.getRoot());
        System.out.println();
        System.out.print("(中序排列)In-Order:");
        inorder(tree.getRoot());
        System.out.println();
        System.out.print("(后序排列)Post-Order:");
        postorder(tree.getRoot());
        System.out.println();
        System.out.print("(前序排列-非递归调用)Pre-Order:");
        iterativePreorder(tree.getRoot());
        System.out.println();
        System.out.print("(中序排列-非递归调用)In-Order:");
        iterativeInorder(tree.getRoot());
        System.out.println();
        System.out.print("(后序排列-非递归调用)Post-Order:");
        iterativePostorder(tree.getRoot());
        System.out.println();
    }
}

二叉树节点 BTNode
package edu.yhf.demo.binaryTree;
/** 二叉树节点 */
public class BTNode {
    private char key;
    private BTNode left, right;
    public BTNode(char key) {
        this(key, null, null);
    }
    public BTNode(char key, BTNode left, BTNode right) {
        this.key = key;
        this.left = left;
        this.right = right;
    }
    public char getKey() {
        return key;
    }
    public void setKey(char key) {
        this.key = key;
    }
    public BTNode getLeft() {
        return left;
    }
    public void setLeft(BTNode left) {
        this.left = left;
    }
    public BTNode getRight() {
        return right;
    }
    public void setRight(BTNode right) {
        this.right = right;
    }
}

树I显示结果:
(前序排列)Pre-Order:H D B A C G F E
(中序排列)In-Order:B A D C H G E F
(后序排列)Post-Order:A B C D E F G H
(前序排列-非递归调用)Pre-Order:H D B A C G F E
(中序排列-非递归调用)In-Order:B A D C H G E F
(后序排列-非递归调用)Post-Order:A B C D E F G H

树II显示结果
(前序排列)Pre-Order:A B D E G J C F N K I
(中序排列)In-Order:D B J G E A C N K F I
(后序排列)Post-Order:D J G E B K N I F C A
(前序排列-非递归调用)Pre-Order:A B D E G J C F N K I
(中序排列-非递归调用)In-Order:D B J G E A C N K F I
(后序排列-非递归调用)Post-Order:D J G E B K N I F C A

说明:
    /*遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次。由于二叉树是非线性结构,因此,树的遍历实质上是将二叉树的各个结点转换成为一个线性序列来表示。 
      设L、D、R分别表示遍历左子树、访问根结点和遍历右子树, 则对一棵二叉树的遍历有三种情况:DLR(称为先根次序遍历),LDR(称为中根次序遍历),LRD (称为后根次序遍历)。 
      (1)先序遍历 
      访问根;按先序遍历左子树;按先序遍历右子树 
      (2)中序遍历 
      按中序遍历左子树;访问根;按中序遍历右子树 
      (3)后序遍历 
      按后序遍历左子树;按后序遍历右子树;访问根 
      (4)层次遍历 
      即按照层次访问,通常用队列来做。访问根,访问子女,再访问子女的子女(越往后的层次越低)(两个子女的级别相同)

个人感悟:

    */  

/--2017/2/28 11:21:51
1.前序很容易理解;
中序最易出错.
中序,后序遍历都是从最左侧的单位开始,比如:树II.
中序遍历第一个节点是D,而非J. ★$)
  • 大小: 106 KB
分享到:
评论

相关推荐

    chatbox 本地部署大模型 私有化部署

    chatbox 本地部署大模型 私有化部署

    Delphi 12.3控件之pdfium-win-x86.rar

    Delphi 12.3控件之pdfium-win-x86.rar

    图神经网络中注意力机制的应用及其最新研究进展

    内容概要:本文详细探讨了图神经网络(GNN)与注意力机制的结合,特别是在图结构数据处理中的应用。文章首先简要介绍了图神经网络和注意力机制的概念,接着重点介绍了图注意力网络(GAT),以及其他几种基于注意力机制的图神经网络模型,如GATE、GaAN、RGAT等。文中还讨论了这些模型在节点分类、图分类、链接预测等任务中的具体应用,并指出了现有模型存在的问题及改进措施。最后,文章展望了未来的研究方向,强调了提升模型表达能力、增强可解释性和构建多尺度结构的重要性。 适合人群:从事图神经网络研究的科研人员、研究生及相关领域的从业人员。 使用场景及目标:① 提升图神经网络在处理复杂图结构数据时的性能;② 改善图神经网络的可解释性和可视化能力;③ 设计更高效的图注意力机制以应对大规模图数据。 其他说明:本文不仅回顾了图注意力网络的经典模型,还介绍了最新的研究成果,为未来的研究提供了有价值的参考。

    CSDN博客之星:技术分享盛宴助力交流与品牌成长

    文案: “CSDN博客之星”是技术圈的年度盛事,助力博主闪耀成长!通过参与评选,你不仅能提升个人品牌、链接行业大牛,还能在创作与交流中精进技术。活动汇聚优质内容与活跃作者,为技术人提供展示舞台。无论你是资深博主还是新人,这里都有机会被看见、被认可。原创干货+粉丝互动,让你的技术分享更有影响力!快来加入,与同行共赴星光之约! (注:严格控制在100字左右,突出活动价值与参与收益,简洁有力。)

    基于Qt的串口调试助手:协议解析与通信数据处理

    内容概要:本文详细介绍了使用Qt编写的串口调试助手的源代码及其功能特性。该工具不仅支持基本的串口通信,还集成了自定义协议解析、帧判断、通信数据保存等功能。文章重点展示了通信模块的核心代码,如帧同步处理、协议配置界面的设计、数据持久化、帧同步配置、文件保存功能以及定时发送功能等。此外,还提到了一些实用的小技巧和注意事项,如协议解析窗口的隐藏调试控制台、文件名生成规则、跨线程数据传递等。 适合人群:具备一定Qt编程基础,从事嵌入式开发或串口通信相关工作的工程师和技术爱好者。 使用场景及目标:适用于需要频繁进行串口调试的开发者,帮助他们提高调试效率,快速定位问题。具体应用场景包括但不限于智能设备调试、工业控制系统开发、物联网设备测试等。 其他说明:文中提供了大量代码示例,便于读者理解和实践。同时,作者分享了许多实际开发中的经验和技巧,有助于读者避开常见的陷阱并优化代码性能。

    基于PSO粒子群算法的PID控制器参数优化及其Matlab实现

    内容概要:本文详细介绍了如何利用粒子群优化(PSO)算法对PID控制器进行参数整定。首先解释了PSO的基本概念和工作原理,即通过模拟自然界中鸟群或鱼群的行为,在三维参数空间中寻找最佳的Kp、Ki、Kd值。文中提供了完整的Matlab代码示例,涵盖了从初始化设置、适应度函数定义到粒子位置更新的具体步骤。同时,作者分享了一些实用的经验技巧,如选择合适的粒子数量、惯性权重以及学习因子等参数,并讨论了不同适应度函数的选择对优化结果的影响。此外,还展示了PSO-PID的实际应用案例,包括与传统方法的性能对比,以及在非线性系统中的优越表现。 适合人群:自动化控制领域的研究人员和技术人员,尤其是那些希望提高PID控制器性能并减少手动调参工作量的人。 使用场景及目标:适用于各种工业控制系统中PID控制器的参数优化任务,旨在通过智能化手段获得更好的动态响应特性,如更快的调节时间和更低的超调量。对于复杂的非线性系统尤为有用。 其他说明:附带详细的代码注释和可视化工具,帮助读者更好地理解和掌握PSO-PID的工作流程。建议读者在实践中灵活调整相关参数,以适应不同的应用场景。

    人员数量检测+Python+YOLOv8

    运行程序,弹出选择本地图片窗口,选择一张带有人员的图片,检测出图片中的人员个数并用方框进行标注

    Delphi 12.3控件之Sublime Text 4 Build 4189 x64.7z

    Delphi 12.3控件之Sublime Text 4 Build 4189 x64.7z

    智慧农贸信息化管理平台.zip

    Java项目基于ssm框架的课程设计,包含LW+ppt

    工业自动化中三菱FX3U与台达变频器Modbus通信程序详解

    内容概要:本文详细介绍了三菱FX3U PLC与台达变频器之间通过Modbus协议进行通信的方法。首先概述了Modbus通信协议及其master-slave模式的工作原理,接着深入分析了通信程序的具体结构,包括初始化通信、读取通信参数、执行通信任务以及错误处理等环节。文中提供了详细的代码示例,解释了如何通过RS指令配置通信参数、构建Modbus帧、处理CRC校验及通信触发逻辑。此外,还分享了一些实用的调试技巧和常见问题解决方案,如通信超时处理、硬件接线注意事项等。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是那些需要掌握PLC与变频器通信技能的人群。 使用场景及目标:适用于需要实现三菱FX3U PLC与台达变频器之间高效通信的实际工程项目。通过学习本文,读者能够掌握Modbus通信协议的应用,编写可靠的通信程序,确保工业控制系统稳定运行。 其他说明:本文不仅提供了理论知识,还包括大量实践经验,帮助读者更好地理解和应对实际工程中的挑战。

    ssm电子资源管理系统 LW PPT.zip

    Java项目基于ssm框架的课程设计,包含LW+ppt

    精心整理通用求职简历模板(商务清新蓝色风)30+|面试技巧自我介绍大全|面试避坑话术↑邀约率120%

    精选30套企业通用HR认证的极简求职模板,覆盖应届生/转行/社招全场景,同步整合高频率面试问答话术库+避坑指南(含薪酬谈判、离职原因黑话翻译)。面试场景分类与应对包括个人背景类、行为类问题、技术类问题、职业规划类、情景模拟类、公司文化类、压力测试类、薪资谈判类、团队合作类以及行业认知类等面试技巧类包括面试的自我介绍的时长、自我介绍的内容、自我介绍的表达、自我介绍的要点等,结合配套的企业求职模板,全程无废话纯干货版式,手机电脑即拿即用,帮你省下80%海投时间,把简历变成精准收割offer的流量入口。

    win11专业版24H2设置共享服务和访问共享

    win11专业版24H2设置共享服务和访问共享

    Delphi 12.3控件之RADStudio-12-1-29-0-51961-7529-KeyPatch.7z

    Delphi 12.3控件之RADStudio-12-1-29-0-51961-7529-KeyPatch.7z

    Runapi 3.3.0 截止2025年3月27日最新版

    RunApi 是一款集调试、测试、文档输出以及项目协作的接口工具(功能上类似postman)。目前支持客户端版和在线精简版 ,包含接口测试/项目协作等功能。

    博客之星2024技术博客大赛规则详解:流程、评分标准与奖项公布

    文案: “博客之星2024技术博客大赛”火热开启!参赛需提交全年20篇原创博客(均分60+),评选依据创作影响力、文章质量及个人影响力综合评分。优胜者可赢取硬件设备、荣誉证书及专属虚拟福利。活动旨在发掘优秀技术博主,推动知识共享。IT创作者快来参与,展现你的专业价值! (100字)

    谷歌浏览器,安卓离线版APK

    谷歌浏览器,安卓离线版APK

    基于STM32F1的BLDC电机有/无传感器驱动程序设计与实践

    内容概要:本文详细介绍了基于STM32F1平台的BLDC电机控制源码,涵盖有传感器(霍尔)和无传感(反电动势过零检测)两种驱动方式。文中展示了关键代码片段,如霍尔信号处理、反电动势过零检测、双闭环PID控制器的设计与实现。霍尔方案通过中断捕获霍尔信号并更新换相表,确保电机稳定运行;无传感方案则依靠ADC采样相电压,通过过零检测实现换相。双闭环PID用于精确控制电机的速度和电流,避免振荡。此外,文章提供了详细的调参建议和避坑指南,帮助开发者快速掌握BLDC电机控制的核心技术。 适合人群:具有一定嵌入式开发经验,尤其是对电机控制感兴趣的工程师和技术爱好者。 使用场景及目标:适用于希望深入了解BLDC电机控制原理及其具体实现的技术人员。通过学习本文,可以掌握有传感器和无传感两种控制方法的具体实现细节,以及如何优化PID参数以提高控制系统性能。 其他说明:文章不仅提供理论讲解,还包括大量实用的代码片段和调试建议,有助于读者快速上手并在实践中不断改进。

    PyTorch学习资料合集

    PyTorch学习资料合集:快速掌握深度学习利器 PyTorch是由Facebook开发的强大开源框架,以动态计算图和易用性著称,支持高效构建与训练神经网络。本合集涵盖核心知识点:张量操作、自动求导、神经网络模块、优化器、数据加载等,并包含torchvision库的计算机视觉工具。无论你是初学者还是进阶者,这些资料都能助你快速上手,灵活应对学术与工业级AI任务。

    三菱FX5U PLC在4轴伺服机器人控制系统中的结构化编程与应用

    内容概要:本文详细介绍了基于三菱FX5U PLC的四轴伺服机器人控制系统开发过程及其应用。主要内容涵盖PLC结构化编程的优势、伺服控制的具体实现方法、人机界面(HMI)的开发要点,以及开发过程中积累的实际经验和技巧。文中展示了如何通过结构化编程提高程序的可读性和维护性,具体包括主程序框架、伺服初始化和同步控制、触摸屏数据交互等方面的内容。此外,还分享了伺服参数调试、代码版本管理和测试阶段的注意事项等宝贵经验。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC编程和伺服控制系统感兴趣的读者。 使用场景及目标:适用于需要开发复杂多轴伺服控制系统的工程项目,旨在帮助开发者掌握三菱FX5U PLC的结构化编程方法,提升伺服控制系统的性能和可靠性。 其他说明:文中提供了丰富的代码示例和实践经验,有助于读者更好地理解和应用相关技术。

Global site tag (gtag.js) - Google Analytics