java树状结构之二叉树
参考:http://blog.csdn.net/zhangerqing/article/details/8822476
前面已经提到过树和二叉树的相关概念内容,下面主要来介绍下关于二叉树的创建,遍历,查找等相关内容。在此之间先说一个概念,广义表
一、广义表
广义表是一种非线性的数据结构,广义表是n个数据元素d1,d2,d3,…,dn的有限序列,但线性表不同的是,广义表中的di 则既可以是单个元素,还可以是一个广义表,通
常记作:GL=(d1,d2,d3,…,dn)。GL是广义表的名字,通常广义表的名字用大写字母表示。n是广义表的长度。若其中di是一个广义表,则称di是广义表GL的子表。在
广义表GL中,d1是广义表GL的表头,而广义表GL其余部分组成的表(d2,d3,…,dn)称为广义表的表尾。由此可见广义表的定义是递归定义的。
二、创建二叉树
1 定义Node节点
public class Node {
private char data;
private Node lchild;
private Node rchild;
public Node(){
}
public char getData() {
return data;
}
public void setData(char data) {
this.data = data;
}
public Node getRchild() {
return rchild;
}
public void setRchild(Node rchild) {
this.rchild = rchild;
}
public Node getLchild() {
return lchild;
}
public void setLchild(Node lchild) {
this.lchild = lchild;
}
public Node(char ch, Node rchild, Node lchild) {
this.data = ch;
this.rchild = rchild;
this.lchild = lchild;
}
public String toString() {
return "" + getData();
}
}
2. 二叉树创建类
Node createTree(String express, char split){
String[] array = StringUtils.split(express, split);
int length = array.length-1;
int capicity = (1<<(length-1))-1;
Node[] nodes = new Node[capicity];
Node head =null;
Node p = null;
int level = -1;
int childType = 0;
int index =0;
char data;
char[] charArray = express.toCharArray();
while(index < charArray.length-1){
data = charArray[index];
switch(data){
case '(':
level++;
childType = 1;
nodes[level]=p;
break;
case ',':
childType = 2;
break;
case ')':
level--;
break;
default:
p = new Node(data, null, null);
if(head == null){
head = p;
break;
}else{
switch(childType){
case 1: nodes[level].setLchild(p);break;
case 2: nodes[level].setRchild(p);break;
}
}
}
data = charArray[++index];
}
return head;
}
三、二叉树的遍历
1. 先序遍历
此种遍历模式是先读取父节点,然后再读取左右节点。
1.1 递归先序遍历
/**
* 递归先序遍历
* @param node
*/
public void preTraversal(Node node){
if(null == node){
return;
}else{
System.out.print(node.getData()+" ");
preTraversal(node.getLchild());
preTraversal(node.getRchild());
}
}
1.2 非递归先序遍历
/**
* 非递归先序遍历
* @param node
*/
public void preTraversalNoRecursive(Node node){
if(null == node){
return;
}
Node p = null;
int level=0;
Node[] stack = new Node[1024];
stack[0] = node;//先将树根节点压入栈中
while(level > -1){
p = stack[level];
level--;//移除栈的顶层节点
System.out.print(p.getData()+" ");
if(null != p.getRchild()){//如果树右子节点不为null,则压入栈中
stack[++level] = p.getRchild();
}
if(null != p.getLchild()){//如果树左子节点不为Null,则压入栈中
stack[++level] = p.getLchild();
}
}
}
2. 中序遍历
此种遍历模式是先读取左子节点,然后读取父节点,最后读取右节点。
2.1 递归中序遍历
<span style="white-space:pre"> </span>/**
* 递归中序遍历
* @param node
*/
public void midTraversal(Node node){
if(null == node){
return;
}else{
midTraversal(node.getLchild());
System.out.print(node.getData()+" ");
midTraversal(node.getRchild());
}
}
2.2 非递归中序遍历
/**
* 非递归中序遍历
* @param node
*/
public void midTraversalNoRecursive(Node node){
if(null == node){
return;
}
int level = -1;
Node[] stack = new Node[1024];
Node p = node;
while(p != null || level > -1){//节点不为null或则当前层数不为-1
while(p != null){
stack[++level] = p;//将p压入栈
p = p.getLchild();//获取p的左子结点
}
if(level > -1){
p = stack[level];//获取栈顶层节点
level--;
System.out.print(p.getData()+" ");
p = p.getRchild();//读取为最下方的左子节点,接着访问该节点的右子节点
}
}
}
3. 后序遍历
此种遍历模式是先读取左右节点,然后再读取父节点。
3.1 递归后序遍历
<span style="white-space:pre"> </span>/**
* 递归后序遍历
* @param node
*/
public void lastTraversal(Node node){
if(null == node){
return;
}else{
lastTraversal(node.getLchild());
lastTraversal(node.getRchild());
System.out.print(node.getData()+" ");
}
}
4. 二叉树的深度遍历
待补充
5. 二叉树的广度遍历
待补充
java树状结构之二叉树的更多相关文章
- 树状结构Java模型、层级关系Java模型、上下级关系Java模型与html页面展示
树状结构Java模型.层级关系Java模型.上下级关系Java模型与html页面展示 一.业务原型:公司的组织结构.传销关系网 二.数据库模型 很简单,创建 id 与 pid 关系即可.(pid:pa ...
- java集合树状结构及源码
java集合树状结构及源码 最近一直想看一下java集合的源码,毕竟平时用的比较多,但总是感觉是跟着习惯new出来一个对象,比如ArrayList,HashMap等等,所以就简单的看了一下,了解了一下 ...
- Android无限级树状结构
通过对ListView简单的扩展.再封装,即可实现无限层级的树控件TreeView. package cn.asiontang.nleveltreelistview; import android.a ...
- 浅谈oracle树状结构层级查询之start with ....connect by prior、level及order by
浅谈oracle树状结构层级查询 oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的,虽然我是一个java程序开发者,我一直觉得只 ...
- 浅谈oracle树状结构层级查询测试数据
浅谈oracle树状结构层级查询 oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的,虽然我是一个java程序开发者,我一直觉得只 ...
- oracle存储过程删除树状结构的表数据
今天在删除一个车辆品牌表的时候,遇到了一个问题,是在java的代码中做逻辑删除还是直接在Oracle中一次删除完成呢 思来想去觉得还是在sql里直接删除比较合适, 为什么呢? 第一,涉及数据库的读写操 ...
- 分享使用NPOI导出Excel树状结构的数据,如部门用户菜单权限
大家都知道使用NPOI导出Excel格式数据 很简单,网上一搜,到处都有示例代码. 因为工作的关系,经常会有处理各种数据库数据的场景,其中处理Excel 数据导出,以备客户人员确认数据,场景很常见. ...
- 由简入繁实现Jquery树状结构
在项目中,我们经常会需要一些树状结构的样式来显示层级结构等,比如下图的样式,之前在学.net的时候可以直接拖个服务端控件过来直接使用非常方便.但是利用Jquery的一些插件,也是可以实现这些效果的,比 ...
- php实现树状结构无级分类
php实现树状结构无级分类 ).",'树2-1-1-2')";mysql_query($sql);?>
随机推荐
- ADO.NET学习小结【1】正在更新...
小弟正在学习ADO.net有误的地方还请大大们批评指出,小弟在此谢过了 一.ADO.net简述: 以前我们写程序尤其是写和数据库有关的应用程序时,你我都得要了解Microsoft ADO COM对象才 ...
- lucene开发序之luke神器
lucene是一款很优秀的全文检索的开源库,目前最新的版本是lucene4.4,关于lucene的历史背景以及发展状况,在这里笔者就不多介绍了,如果你真心想学习lucene,想必在这之前你已经对此作过 ...
- hdu 1800 Flying to the Mars
Flying to the Mars 题意:找出题给的最少的递增序列(严格递增)的个数,其中序列中每个数字不多于30位:序列长度不长于3000: input: 4 (n) 10 20 30 04 ou ...
- Vue.js 2.0 和 React、Augular
Vue.js 2.0 和 React.Augular 引言 这个页面无疑是最难编写的,但也是非常重要的.或许你遇到了一些问题并且先前用其他的框架解决了.来这里的目的是看看Vue是否有更好的解决方案.那 ...
- 导航 - 利用系统自带的App导航
导航: 可以将需要导航位置丢给系统自带的App进行导航 发送网络请求到公司服务器, 获取导航数据, 自己手动绘制导航 利用三方SDK进行导航(百度) #import "ViewControl ...
- app应用程序本地化--备用
一.简介 * 使用本地化功能,可以轻松地将应用程序翻译成多种语言,甚至可以翻译成同一语言的多种方言 * 如果要添加本地化功能,需要为每种支持的语言创建一个子目录,称为”本地化文件夹”,通常使用.lpr ...
- lua之mysql编程
环境搭建 #mysql 安装 sudo apt-get install mysql-server mysql-client # lua mysql 开发驱动安装 sudo apt-get instal ...
- android中viewPager+fragment实现的屏幕左右切换(进阶篇)
Fragment支持在不同的Activity中使用并且可以处理自己的输入事件以及生命周期方法等.可以看做是一个子Activity. 先看一下布局: 1 <LinearLayout xmlns:a ...
- GSM、GPRS、EDGE、2G、3G与WAP的关系
1.GSM(Global System of Mobile communication)即全球移动通讯系统: 是目前使用人数最大的移动通信网络,就是2G的移动通信技术,是一种电路交换系统.这种网络仅提 ...
- ANDROID_MARS学习笔记_S02_012_ANIMATION_利用AnimationListener在动画结束时删除或添加组件
一.代码 1.xml(1)activity_main.xml <?xml version="1.0" encoding="utf-8"?> < ...