二叉树的先序、中序、后序和中序遍历——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答案后心里还不断 ...
随机推荐
- 手把手教你利用微软的Bot Framework,LUIS,QnA Maker做一个简单的对话机器人
最近由于要参加微软亚洲研究院的夏令营,需要利用微软的服务搭建一个对话Bot,以便对俱乐部的情况进行介绍,所以现学了几天,搭建了一个简单的对话Bot,期间参考了大量的资料,尤其是下面的这篇博客: htt ...
- EasyUI 异步Tree
用etmvc framework返回json数据.创建HTML标记 <ul id="tt"></ul> 创建jQuery代码我们使用url属性来指向远程数据 ...
- Hadoop中HDFS工作原理
转自:http://blog.csdn.net/sdlyjzh/article/details/28876385 Hadoop其实并不是一个产品,而是一些独立模块的组合.主要有分布式文件系统HDFS和 ...
- 22SpringMvc_jsp页面上的数据传递到控制器的说明
假设有这个一个业务:在jsp页面上写入数据,然后把这个数据传递到后台. 效果如下:
- 【BZOJ】1646: [Usaco2007 Open]Catch That Cow 抓住那只牛(bfs)
http://www.lydsy.com/JudgeOnline/problem.php?id=1646 这一题开始想到的是dfs啊,,但是本机测样例都已经re了... 那么考虑bfs...很巧妙? ...
- 【BZOJ】1649: [Usaco2006 Dec]Cow Roller Coaster(dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=1649 又是题解... 设f[i][j]表示费用i长度j得到的最大乐趣 f[i][end[a]]=ma ...
- WPF 在TextBox失去焦点时检测数据,出错重新获得焦点解决办法
WPF 在TextBox失去焦点时检测数据,出错重新获得焦点解决办法 在WPF的TextBox的LostFocus事件中直接使用Focus()方法会出现死循环的问题 正确的使用方式有2中方法: 方法一 ...
- Objective-C Runtime初探:self super
题目 上题目,已知A是爷爷,B是爸爸,C是孙子. @interface A : NSObject - (void)f; @end @interface B : A - (void)f; - (void ...
- 图像,script,link 空地址带来的困惑
前端开发人员估计很多人都不清楚这些标签的空地址会带来哪些让人意想不到的问题.包括我,很长一段时间都认为这是无伤大雅的事情,直到有一次遇到莫名其妙的问题,下面会拿image来详细介绍(其他类似). 下面 ...
- Angular2 组件与模板 -- 输入和输出属性
Input and Output properties 输入属性是一个带有@Input 装饰器的可设置属性,当它通过属性绑定的形式被绑定时,值会"流入"到这个属性. 输出属性是一个 ...