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. Roslyn介绍

    介绍 一般来说,编译器是一个黑箱,源代码从一端进入,然后箱子中发生一些奇妙的变化,最后从另一端出来目标文件或程序集.编译器施展它们的魔法,它们必须对所处理的代码进行深入的理解,不过相关知识不是每个人都 ...

  2. 字符集导致乱码问题,gi安装问题

    今天是2014-4-24,今天中午收到一个天津网友问的一个安装gi的问题,和一个网友问的字符集问题:在此整理一下 问题一: gi安装问题: 问题描写叙述: 在安装gi的时候提示:"INS-2 ...

  3. [vundle]利用vundle工具来管理vim插件

    转自:http://os.51cto.com/art/201507/484174.htm Vim是Linux上一款用途广泛的轻量级文本编辑工具.虽然对普通的Linux用户来说开始学用起来难度相当大,但 ...

  4. CSS——div居中,window.open(0

    margin:0 auto 表示什么意思?? margin后面如果只有两个参数的话,第一个表示top和bottom,第二个表示left和right因为0 auto,表示上下边界为0,左右则根据宽度自适 ...

  5. nginx的root alias 指令

    location /img/ { alias /var/www/image/; } #若按照上述配置的话,则访问/img/目录里面的文件时,ningx会自动去/var/www/image/目录找文件 ...

  6. DP - 字符混编

    字符混编 Problem's Link ---------------------------------------------------------------------------- Mea ...

  7. 匿名内部类 Inner class

    先说结论 匿名内部类分两种,一种是接口的匿名实现,一种是类的匿名子类!后者往往用于修改特定方法. 再说起因 本来以为匿名内部类很简单,就是接口的匿名实现,直到我发现了下面这段代码: public cl ...

  8. EMPTY表示元素不能包含文本,也不能包含子元素

    <?xml version=”1.0″ encoding=”GB2312″?> <!ELEMENT Customer EMPTY> <!ATTLIST Customer称 ...

  9. IPL和SPL的区别

    IPL是英文Initial Program Loader的简称,意为初始程序的装入程序,其主要功能为负责主板.电源.硬件初始化程序.并把SPL装入RAM空间中,当IPL损坏则只能更换字库解决否则只能换 ...

  10. LR的响应时间与使用IE所感受时间不一致的讨论(摘抄补充)

    http://www.51testing.com/html/33/564333-865629.html 在做性能测试时,有时碰到这样一种情况,使用性能工具LR测试出来的响应时间比实际使用IE感受到的时 ...