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. w3c html dom

    http://www.w3school.com.cn/ SQL语句学习 http://www.w3school.com.cn/sql/sql_like.asp

  2. 计算机网络——OSI、TCP/IP协议族详解

    一.OSI七层协议体系结构域TCP/IP四层体系结构对比 ISO/OSI模型,即开放式通信系统互联参考模型(Open System Interconnection Reference Model),是 ...

  3. Java解析json(二):jackson

    Java解析json(二):jackson   官方参考 Jackson Home Page:https://github.com/FasterXML/jackson Jackson Wiki:htt ...

  4. 第二百七十二节,Tornado框架-iframe标签框架伪造ajax

    Tornado框架-iframe标签框架伪造ajax html <!DOCTYPE html> <html> <head lang="en"> ...

  5. 有关Servlet的生命周期说法正确的有( )。

    A.Servlet的生命周期由Servlet实例控制 B.init()方法在创建完Servlet实例后对其进行初始化,传递的参数为实现ServletContext接口的对象 C.service()方法 ...

  6. php计算数组相同值出现次数的代码(array_count_values)

    php计算数组相同值出现次数,可以使用php自带函数array_count_values : 说明 array array_count_values ( array $input )array_cou ...

  7. Linux JAVA 配置

    wget http://download.oracle.com/otn-pub/java/jdk/7u25-b15/jdk-7u25-linux-x64.tar.gz tar zxvf jdk-7u2 ...

  8. MathType模板不见了如何处理

    MathType是一款在编辑公式方面非常好用的软件!并广泛应用在文档编辑与期刊排版中.但是新手用户在使用MathType编辑公式时会遇到一些处理不了的状况,这个时候就需要去找一些相关的教程来解决问题. ...

  9. mysql备份数据库常见问题

    如果遇到mysqldump: unknown option '--no-beep'  ,可以加上 --no-dafaults 命令结尾无需分号 mysqldump --no-defaults -uro ...

  10. 剑指 offer set 11 最小的K个数

    总结 1. 假如允许修改给定数组, 那么通过快排的子过程, 可以在 o(n) 时间复杂度内得出结果. 2. 对于海量数据和不允许修改的数据, 通过最小堆的方式更好, 通过维持一个大小为 K 的最小堆