package treeTraverse;
/**
* 定义一个树的结点类
*/
public class Node {
private int data;
private Node leftChild;
private Node rightChild; public Node(){ } public Node(int data) {
super();
this.data = data;
} public int getData() {
return data;
} public void setData(int data) {
this.data = data;
} public Node getLeftChild() {
return leftChild;
} public void setLeftChild(Node leftChild) {
this.leftChild = leftChild;
} public Node getRightChild() {
return rightChild;
} public void setRightChild(Node rightChild) {
this.rightChild = rightChild;
} }
 package treeTraverse;

 import java.util.ArrayList;
import java.util.List; /**
* 实现树的先、中、后及层次遍历
*/
public class FindTree { private void visit(int data){
System.out.print(data + "-->");
}
//先序遍历
public void preOrder(Node root){
if(root == null) return ; visit(root.getData());
preOrder(root.getLeftChild());
preOrder(root.getRightChild());
}
//中序遍历
public void inOrder(Node root){
if(root == null) return ; inOrder(root.getLeftChild());
visit(root.getData());
inOrder(root.getRightChild());
}
//后序遍历
public void afterOrder(Node root){
if(root == null) return ; afterOrder(root.getLeftChild());
afterOrder(root.getRightChild());
visit(root.getData());
} /**
* 层次遍历(非递归)
* 思路:
* 现将二叉树头结点入队列,然后出队列,访问该结点,
* 如果它有左子树,则将左子树根节点入队;
* 如果它有右子树,则将右子树根节点入队;
* 然后出队列,对出队列的结点访问,如此反复,知道队列为空。
*/
public void levelOrder(Node root){ List<Node> queue = new ArrayList<Node>();
if(root != null){
queue.add(root);//将根结点入队
while(queue.size() != 0){//当队列不空的时候进行循环
Node q = queue.remove(0);//出队列 返回从列表中移除的元素
visit(q.getData());//访问该结点 if(q.getLeftChild() != null){//如果它有左子树,则将左子树根节点入队;
queue.add(q.getLeftChild());
}
if(q.getRightChild() != null){//如果它有右子树,则将右子树根节点入队;
queue.add(q.getRightChild());
}
}
}
}
}
 package treeTraverse;

 /**
* 构建一个二叉树排序树并测试
*/
public class TestTree {
public static void main(String[] args) {
FindTree ft = new FindTree();
int[] array = {12,76,35,22,16,48,90,46,9,40,90}; Node root = new Node(array[0]);
for(int i = 1; i < array.length; i++){
insert(root, array[i]);
}
System.out.println("preorder:");
ft.preOrder(root);
System.out.println("\n"+"inorder:");
ft.inOrder(root);
System.out.println("\n"+"afterorder:");
ft.afterOrder(root);
System.out.println("\n"+"levelOrder:");
ft.levelOrder(root);
} /**
* 构造二叉排序树, 性质如下:
* 若它的左子树不空,则左子树上所有关键字的值均小于根关键字的值
* 若它的右子树不空,则右子树上所有关键字的值均小于根关键字的值
* 如果输出二叉树排序树的中序遍历,则这个序列是递增有序的
* @param root
* @param data
*/
private static void insert(Node root, int data) {
if(root.getData() < data){
if(root.getRightChild() == null){
root.setRightChild(new Node(data));
}else{
insert(root.getRightChild(), data);
}
}else {
if(root.getData() > data){
if(root.getLeftChild() == null){
root.setLeftChild(new Node(data));
}else{
insert(root.getLeftChild(), data);
}
}
}
} }

遍历结果:

preorder:
12-->9-->76-->35-->22-->16-->48-->46-->40-->90-->
inorder:
9-->12-->16-->22-->35-->40-->46-->48-->76-->90-->
afterorder:
9-->16-->22-->40-->46-->48-->35-->90-->76-->12-->
levelOrder:
12-->9-->76-->35-->90-->22-->48-->16-->46-->40-->

二叉树的先序、中序、后序和中序遍历——Java实现的更多相关文章

  1. 前、中、后序遍历随意两种是否能确定一个二叉树?理由? && 栈和队列的特点和区别

    前序和后序不能确定二叉树理由:前序和后序在本质上都是将父节点与子结点进行分离,但并没有指明左子树和右子树的能力,因此得到这两个序列只能明确父子关系,而不能确定一个二叉树. 由二叉树的中序和前序遍历序列 ...

  2. DS Tree 已知先序、中序 => 建树 => 求后序

    参考:二叉树--前序和中序得到后序 思路历程: 在最初敲的时候,经常会弄混preorder和midorder的元素位置.大体的思路就是在preorder中找到根节点(根节点在序列的左边),然后在mid ...

  3. TZOJ 3209 后序遍历(已知中序前序求后序)

    描述 在数据结构中,遍历是二叉树最重要的操作之一.所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问. 这里给出三种遍历算法. 1.中序遍历的递归算法定义:  ...

  4. [Java]算术表达式求值之二(中序表达式转后序表达式方案,支持小数)

    Inlet类,入口类,这个类的主要用途是验证用户输入的算术表达式: package com.hy; import java.io.BufferedReader; import java.io.IOEx ...

  5. [Java]算术表达式求值之一(中序表达式转后序表达式方案)

    第二版请见:https://www.cnblogs.com/xiandedanteng/p/11451359.html 入口类,这个类的主要用途是粗筛用户输入的算术表达式: package com.h ...

  6. 已知树的前序、中序,求后序的java实现&已知树的后序、中序,求前序的java实现

    public class Order { int findPosInInOrder(String str,String in,int position){ char c = str.charAt(po ...

  7. Tree Traversals Again(根据前序,中序,确定后序顺序)

    题目的大意是:进行一系列的操作push,pop.来确定后序遍历的顺序 An inorder binary tree traversal can be implemented in a non-recu ...

  8. sql 分组后按时间降序排列再取出每组的第一条记录

    原文:sql 分组后按时间降序排列再取出每组的第一条记录 竞价记录表: Aid 为竞拍车辆ID,uid为参与竞价人员ID,BidTime为参与竞拍时间 查询出表中某人参与的所有车辆的最新的一条的竞价记 ...

  9. 五二不休息,今天也学习,从JS执行栈角度图解递归以及二叉树的前、中、后遍历的底层差异

    壹 ❀ 引 想必凡是接触过二叉树算法的同学,在刚上手那会,一定都经历过题目无从下手,甚至连题解都看不懂的痛苦.由于leetcode不方便调试,题目做错了也不知道错在哪里,最后无奈的cv答案后心里还不断 ...

随机推荐

  1. php的json校验json-schema

    客户端和服务端的http信息传递,采用json几乎成了标配.json格式简单,易于处理,不过由于没有格式规定,无法校验. 好在php有json-schema模块,可以用来验证json是否符合规定的格式 ...

  2. lua工具库penlight--08额外的库(一)

    额外的库 在这一节中的库不再被认为是Penlight的核心部分,但在需要时,仍提供专门的功能. 简单的输入的模式 Lua 的字符串模式匹配是非常强大,通常您将不需要传统的正则表达式库.即便如此,有时  ...

  3. Unix系统编程()检查进程的存在

    检查进程的存在 kill系统调用还有另一重功用.若将参数sig指定为0(即所谓空信号),则无信号发送. 相反,kill仅会去执行错误检查,查看是否可以向目标进程发送信号. 从另一角度来看,这意味着,可 ...

  4. librtmp将本地FLV文件发布到RTMP流媒体服务器

    没有用到ffmpeg库 可以将本地FLV文件发布到RTMP流媒体服务器 使用librtmp发布RTMP流可以使用两种API:RTMP_SendPacket()和RTMP_Write(). 使用RTMP ...

  5. 无偏估计(Unbiased Estimator)

    无偏估计是参数的样本估计量的期望值等于参数的真实值. 一个简单的例子(https://www.zhihu.com/question/22983179/answer/23470969): 比如我要对某个 ...

  6. php -- 魔术方法 之 删除属性:__unset()

    属性重载:当访问一个不存在或者权限不够的属性的时候,能够触发一系列的魔术方法,就叫做属性重载 __unset():当删除一个不存在或者权限不够的属性的时候会自动触发 <?php //属性重载 c ...

  7. db2 improt from coldel0x7c

    db2 load from "C:\20110816\20110816_BankEnterpri seCA.txt" OF del modified by coldel0x7c r ...

  8. python入门(八):连接mysql和STMP

    Python3 MySQL 数据库连接,使用 PyMySQL 连接数据库,并实现简单的增删改查.  mysql连接步骤 1.打开数据库连接 2.使用cursor()方法获取操作游标 3.执行sql和异 ...

  9. 将Oracle数据库转换为SQL Server

    (转发)近期为公司的一个项目数据库进行了转换,将Oracle的Db转换为SqlServer(2000或2005均可),一开始在网上找了一些资料,发现有个工具叫SwisSql的,尝试了一下,没成功,继续 ...

  10. 杂记之--苹果4s手机呼叫转移怎么设置

    您好,呼叫转移只需在拨号界面输入相应的代码就可以,无需其他设置无条件转移 **21*电话号码#再按拨号键 取消代码:##21# *#21# 再按拨号键无信号,关机转移 **62*电话号码#再按拨号键 ...