java 递归深度优先遍历_Java基础 - 二叉树的遍历之深度优先遍历(递归遍历)

package com.yc.test;

import java.util.ArrayList;

import java.util.List;

import com.yc.tree.ThreeLinkBinTree;

import com.yc.tree.ThreeLinkBinTree.Node;

/**

*

* @author wb

*

*遍历二叉树指的是按某种规律依次访问二叉树的每个节点,对二叉树的遍历过程就是将非线性结构的二叉树中的节点排列成线性序列的过程。

*如果采用顺序结构来保存二叉树,程序遍历二叉树将非常容易,无需进行任何思考,直接遍历底层数组即可。如果采用链表来保存二叉树的节点,则有以下两种遍历方式:

*深度优先遍历:这种遍历算法将先访问到树中最深层次的节点。

*广度优先遍历:这种遍历算法将逐层访问每层的节点,先访问根节点,然后访问第二层的节点……以此类推。因此广度优先遍历又被称为按层遍历。

*

*对于深度优先遍历算法而言,他可分为以下三种:

*(1)先序遍历二叉树

*(2)中序遍历二叉树

*(3)后序遍历二叉树

*

*如果L、D、R表示左子树、根、右子树,习惯上总是先遍历左子树,后遍历右子树,根据遍历根节点的顺序不同,上面三种方法可以表示如下:

*DLR:先序遍历

*LDR:中序遍历

*LRD:后序遍历

*

******************************************************************

**深度遍历的先序遍历、中序遍历、后序遍历这三种遍历方式的名称都是针对根节点(D)而言的。*

**先处理根节点(D)时就称为先序遍历,其次处理根节点(D)是就称为中序遍历;最后处理根节点(D)*

**时就称为后序遍历。*

******************************************************************

*

*因为二叉树的定义本身就具有“递归性”,所以深度优先遍历时能非常方便地利用递归来遍历每个节点:一棵非空二叉树由树根、

*左子树和右子树组成,依次遍历这三部分,就可以遍历整个二叉树。

*

*下面以三叉链表结构的二叉树为例实现这三种遍历:

*/

public class DFS {

@SuppressWarnings({ "rawtypes", "unused", "unchecked" })

public static void main(String[] args) {

ThreeLinkBinTree tree = new ThreeLinkBinTree("A");

Node n2_l = tree.addAndReturn(tree.root(), "+", true);

Node n2_r = tree.addAndReturn(tree.root(), "B", false);

Node n3_n2_l = tree.addAndReturn(n2_l, "*", true);

Node n3_n2_r = tree.addAndReturn(n2_l, "D", false);

Node n4_n3_n2_l = tree.addAndReturn(n3_n2_l, "/", true);

Node n4_n3_n2_r = tree.addAndReturn(n3_n2_l, "%", false);

Node n5_n4_n3_n2_l = tree.addAndReturn(n4_n3_n2_r, "E", true);

Node n5_n4_n3_n2_r = tree.addAndReturn(n4_n3_n2_r, "F", false);

/**

* 此时二叉树的情况为:

* A

* │ │

* + ←┘ └→ B

* │ │

* * ←┘ └→ D

* │ │

* / ←┘ └→ %

* │ │

* E ←┘ └→ F

*

*/

//先序遍历结果

System.out.println( "先序遍历结果:" + cDLR(tree) );

//中序遍历结果

System.out.println( "中序遍历结果:" + cLDR(tree) );

//后序遍历结果

System.out.println( "后序遍历结果:" + cLRD(tree) );

}

//先序遍历

public static List cDLR(ThreeLinkBinTree tree){

return dLR(tree.root());

}

private static List dLR(Node node){

List nodes = new ArrayList();

nodes.add(node);

if(node.getLeft() != null){

nodes.addAll(dLR(node.getLeft()));

}

if(node.getRight() != null){

nodes.addAll(dLR(node.getRight()));

}

return nodes;

}

//中序遍历

public static List cLDR(ThreeLinkBinTree tree){

return lDR(tree.root());

}

private static List lDR(Node node){

List nodes = new ArrayList();

if(node.getLeft() != null){

nodes.addAll(dLR(node.getLeft()));

}

nodes.add(node);

if(node.getRight() != null){

nodes.addAll(dLR(node.getRight()));

}

return nodes;

}

//后序遍历

public static List cLRD(ThreeLinkBinTree tree){

return lRD(tree.root());

}

private static List lRD(Node node){

List nodes = new ArrayList();

if(node.getLeft() != null){

nodes.addAll(dLR(node.getLeft()));

}

if(node.getRight() != null){

nodes.addAll(dLR(node.getRight()));

}

nodes.add(node);

return nodes;

}

}

测试结果为:

先序遍历结果:[A, +, *, /, %, E, F, D, B]

中序遍历结果:[+, *, /, %, E, F, D, A, B]

后序遍历结果:[+, *, /, %, E, F, D, B, A]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340170.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大话oraclerac集群、高可用性、备份与恢复_Oracle RAC结构

Oracle RAC结构Oracle真正集群的出现是在Oracle公司收购Rdb并吸收了相关技术优势后,才正在推出了属于自己的RAC集群解决方案。RAC​和集群分类章节提到的集群系统有很多相似之处,从下图我们大概了解一下RAC集群的层次结构和所需的软硬件环境。Oracle Rac…

java obix_obix协议在java中的配置和使用详解

前言本文主要给大家介绍的是关于obix协议在java中的配置和使用,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。什么是 oBIX?简单来讲,obix是一种 XML 通讯协议,使用Http Request/Post方式进行数据通…

java7和java8切换_仍不切换到Java 8的6个理由

java7和java8切换Java 8很棒。 期。 但是……在我们有机会玩耍并玩弄它之后,就该退出了,避免吃盐。 所有的好东西都是有代价的,在这篇文章中,我将分享Java 8的主要痛点。请确保在升级和释放7之前您已经意识到了这些痛点。 1.并行…

python求阶乘之和_python计算阶乘前n项和

广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 知道公式后就很简单了,利用for循环,第几行i1就等于几,当然python中是没有…

您需要了解的有关UI测试的所有信息

让我们从一个问题开始。 用户在网站上进行互动的第一件事是什么? 接口,当然。 网站的外观是在用户身上产生“第一印象”的第一件事。 交互式Web应用程序可以为用户带来成败,这就是为什么越来越多的人选择对其Web应用程序进行UI测试的原因。 …

python docx库使用样例_Python docx库用法示例分析

本文实例分析了Python docx库用法。分享给大家供大家参考,具体如下: 打开及保存文件: from docx import Document document Document(test.docx) document.save(test.docx) 添加文本: document.add_paragraph(test text) 调整文本…

使用java理解程序逻辑试卷_《使用Java理解程序逻辑》试题分析

1、在Java中,一下方法属于String类的有()A:insert(int offset,char [] c);B:replace(int start,int end String str);C:split(String regex);D:endsWith(String suffix);正确答案:C、D解析:A&am…

python合并word单元格_python之DataFrame实现excel合并单元格_python

这篇文章主要为大家详细介绍了python之DataFrame实现excel合并单元格,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 在工作中经常遇到需要将数据输出到excel,且需要对其中一些单元格进行合并,比如如下表表格,需要…

java做服务器端给客户端传数据包_java 服务器怎样给客户端传输数据

展开全部服务器端源码:import java.io.BufferedReader;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.Se…

pooled-jms_Hibernate隐藏的宝石:pooled-lo优化器

pooled-jms介绍 在这篇文章中,我们将揭示一个序列标识符生成器,​​它结合了标识符分配效率和与其他外部系统的互操作性(同时访问底层数据库系统)。 传统上,有两种序列标识符策略可供选择。 序列标识符,对…

apache geode项目结构_Apache Flink-基于Java项目模板创建Flink应用(流计算和批计算)...

Apache Flink创建模板项目有2种方式:1. 通过Maven archetype命令创建;2. 通过Flink 提供的Quickstart shell脚本创建;关于Apache Flink的环境搭建,请参考相关链接:Apache Flink快速入门-基本架构、核心概念和运行流程A…

使用UriBuilder快速创建URI

如果您有权访问JAX-RS API和项目中的实现(很多这样做),则可以使用JAX-RS的UriBuilder通过使用可解析占位符的构建器模式方便地创建URI。 看下面的例子: String host System.getProperty( "host" , "localhost&qu…

python中列表和元组的相同点和不同点_详解Python语言中元组和列表的区别

本篇介绍Python中的元组数据类型,文中会讨论元组与列表的区别,元组的声明、赋值及其相关运算。通过本篇的学习,可以达成如下目标。 ● 掌握元组和列表的区别 ● 掌握元组的声明和赋值 ● 掌握适用于元组的相关运算 Python元组和Python列表数据…

mysql的复制订阅_如何删除发布与复制订阅数据库 'distribuion' 的方法

之前因为从VFP数据库中把数据导入到SQL SERVER2000中,用DTS做了发布与复制数据库distribution ,现在要把它删除,当在企业管理器中执行删除时,提示下面的错误:Error 3724: cannot drop the database distribution becau…

matlabif语句怎么用_公益心 码客行(2)—— 简单语句

回顾与反思&#xff1a;cout语句的用法关于第一课的思考与实践问题&#xff0c;有答案了吗——请写出这个程序的输出结果。#include using namespace std;int main(){cout<<1<cout<<12<return 0;}提示&#xff1a;输出结果如下。13即&#xff1a;输出项为数值…

java 多线程 聊天_Java做一个多线程类似于QQ的聊天程序。

展开全部//时间关系,粗略的做了一下,一个模拟UDP协议的测试,图标,IP,以及端口都可以设成//发送者端的电脑参数32313133353236313431303231363533e78988e69d8331333366306533!import java.awt.BorderLayout;import java.awt.Color;import java.awt.GridLayout;import java.awt.e…

组织机构代码输入测试用例_测试代码以用于过大的输入

组织机构代码输入测试用例在编写单元测试时&#xff0c;我们主要关注业务的正确性。 我们将竭尽所能&#xff0c;开开心心地走在最前沿。 我们有时会进行微基准测试并衡量吞吐量。 但是经常遗漏的一个方面是当输入过大时我们的代码如何表现&#xff1f; 我们测试了如何处理正常…

python子进程关闭fd_python – 捕获崩溃的子进程的“分段错误”...

shell可能会生成“Segmentation fault”消息.要找出该过程是否被SIGSEGV杀死,请检查proc.returncode -signal.SIGSEGV.如果要查看消息,可以在shell中运行该命令&#xff1a;#!/usr/bin/env pythonfrom subprocess import Popen, PIPEproc Popen(shell_command, shellTrue, st…

layui 分页 固定底部_论layui的使用体验

layui这个东西有收费跟免费版本&#xff0c;当然我在工作当中用的是免费的版本。至于说我为什么要用这个东西了&#xff1f;原因是这样的&#xff0c;当时我们用的是datatables&#xff0c;由于前期工作上没有相关的需求说是要什么表格相关列固定啊&#xff0c;自动统计啊&…

巴特沃斯滤波器python_如何用Scipy.signal.bu实现带通巴特沃斯滤波器

您可以跳过button的使用&#xff0c;而只需为过滤器选择一个顺序&#xff0c;看看它是否符合您的过滤条件。要生成带通滤波器的滤波器系数&#xff0c;请将滤波器阶数、截止频率Wn[low, high]&#xff08;表示为奈奎斯特频率的分数&#xff0c;即采样频率的一半&#xff09;和频…