二叉树的先序、中序、后序和中序遍历——Java实现
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实现的更多相关文章
- 前、中、后序遍历随意两种是否能确定一个二叉树?理由? && 栈和队列的特点和区别
前序和后序不能确定二叉树理由:前序和后序在本质上都是将父节点与子结点进行分离,但并没有指明左子树和右子树的能力,因此得到这两个序列只能明确父子关系,而不能确定一个二叉树. 由二叉树的中序和前序遍历序列 ...
- DS Tree 已知先序、中序 => 建树 => 求后序
参考:二叉树--前序和中序得到后序 思路历程: 在最初敲的时候,经常会弄混preorder和midorder的元素位置.大体的思路就是在preorder中找到根节点(根节点在序列的左边),然后在mid ...
- TZOJ 3209 后序遍历(已知中序前序求后序)
描述 在数据结构中,遍历是二叉树最重要的操作之一.所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问. 这里给出三种遍历算法. 1.中序遍历的递归算法定义: ...
- [Java]算术表达式求值之二(中序表达式转后序表达式方案,支持小数)
Inlet类,入口类,这个类的主要用途是验证用户输入的算术表达式: package com.hy; import java.io.BufferedReader; import java.io.IOEx ...
- [Java]算术表达式求值之一(中序表达式转后序表达式方案)
第二版请见:https://www.cnblogs.com/xiandedanteng/p/11451359.html 入口类,这个类的主要用途是粗筛用户输入的算术表达式: package com.h ...
- 已知树的前序、中序,求后序的java实现&已知树的后序、中序,求前序的java实现
public class Order { int findPosInInOrder(String str,String in,int position){ char c = str.charAt(po ...
- Tree Traversals Again(根据前序,中序,确定后序顺序)
题目的大意是:进行一系列的操作push,pop.来确定后序遍历的顺序 An inorder binary tree traversal can be implemented in a non-recu ...
- sql 分组后按时间降序排列再取出每组的第一条记录
原文:sql 分组后按时间降序排列再取出每组的第一条记录 竞价记录表: Aid 为竞拍车辆ID,uid为参与竞价人员ID,BidTime为参与竞拍时间 查询出表中某人参与的所有车辆的最新的一条的竞价记 ...
- 五二不休息,今天也学习,从JS执行栈角度图解递归以及二叉树的前、中、后遍历的底层差异
壹 ❀ 引 想必凡是接触过二叉树算法的同学,在刚上手那会,一定都经历过题目无从下手,甚至连题解都看不懂的痛苦.由于leetcode不方便调试,题目做错了也不知道错在哪里,最后无奈的cv答案后心里还不断 ...
随机推荐
- ashx上传姿势
很多情况下网上流传的cer,asa,cdx……等等来上传,其实很多时候是不行的.但是ashx会好一些. PS:其实这个姿势也蛮老了,但是还是相当一大部分站点存在.也是一个姿势所以写博文记住它.免得忘了 ...
- java 读取Zip文件进行写入
直接读取ZIp文件读取写入到别的文件中. package jp.co.misumi.mdm.batch; import java.io.BufferedReader; import java.io.F ...
- Tablespace for table '`pomelo`.`bag`' exists. Please DISCARD the tablespace before IMPORT.
//遇到的问题是,删除数据库之后,重新创建数据库,在创建数据库表的时候,明明没有该表,却提示存在这个表.这是数据库缓存造成的 //解决方法 FLUSH TABLES; /* 安装MySql数据库(略) ...
- oozie开发注意事项
ooziejob执行后 1. job.properties.coordinatior.xml中设置的值都是不可变的,除非将job kill掉,然后重新调度. oozie job -kill 00000 ...
- 一条经典SQL语句优化实例
1.概述 如下SQL语句发生严重消耗资源的问题,使得OS's load average会在30以上,一条语句需要执行上百秒. /*PIXPatient 184176条DomainPatient 184 ...
- PostgreSQL入门指南
默认端口:5432 创建用户与数据库 PostgreSQL初次安装后,默认会生成一个名为postgres的数据库和一个名为postgres的数据库用户.这里需要注意的是,同时还生成了一个名为postg ...
- php之道
PHP The Right Way. Tweet 欢迎 目前网络上充斥着大量的过时资讯,让 PHP 新手误入歧途,并且传播着错误的实践以及不安全的代码.PHP 之道 收集了现有的 PHP 最佳实践.编 ...
- jenkins环境搭建&配置(二)
Jenkins介绍: Jenkins用于监控持续重复的工作,功能包括: 1.持续的软件版本发布/测试项目. 2.监控外部调用执行的工作. 安装环境: 操作系统:linux(centOS) 软件:jdk ...
- 深入理解Mybatis中sqlSessionFactory机制原理
对于任何框架而言,在使用前都要进行一系列的初始化,MyBatis也不例外.本章将通过以下几点详细介绍MyBatis的初始化过程. 1.MyBatis的初始化做了什么 2. MyBatis基于XML配置 ...
- java.lang.ClassNotFoundException: org.codehaus.jackson.JsonProcessingException 异常解决方案
在SpringMVC中使用Jackson实现json输出时配置如下: <!-- 输出对象转JSON支持 --> <bean id="stringConverter" ...