参考: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树状结构之二叉树的更多相关文章

  1. 树状结构Java模型、层级关系Java模型、上下级关系Java模型与html页面展示

    树状结构Java模型.层级关系Java模型.上下级关系Java模型与html页面展示 一.业务原型:公司的组织结构.传销关系网 二.数据库模型 很简单,创建 id 与 pid 关系即可.(pid:pa ...

  2. java集合树状结构及源码

    java集合树状结构及源码 最近一直想看一下java集合的源码,毕竟平时用的比较多,但总是感觉是跟着习惯new出来一个对象,比如ArrayList,HashMap等等,所以就简单的看了一下,了解了一下 ...

  3. Android无限级树状结构

    通过对ListView简单的扩展.再封装,即可实现无限层级的树控件TreeView. package cn.asiontang.nleveltreelistview; import android.a ...

  4. 浅谈oracle树状结构层级查询之start with ....connect by prior、level及order by

    浅谈oracle树状结构层级查询 oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的,虽然我是一个java程序开发者,我一直觉得只 ...

  5. 浅谈oracle树状结构层级查询测试数据

    浅谈oracle树状结构层级查询 oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的,虽然我是一个java程序开发者,我一直觉得只 ...

  6. oracle存储过程删除树状结构的表数据

    今天在删除一个车辆品牌表的时候,遇到了一个问题,是在java的代码中做逻辑删除还是直接在Oracle中一次删除完成呢 思来想去觉得还是在sql里直接删除比较合适, 为什么呢? 第一,涉及数据库的读写操 ...

  7. 分享使用NPOI导出Excel树状结构的数据,如部门用户菜单权限

    大家都知道使用NPOI导出Excel格式数据 很简单,网上一搜,到处都有示例代码. 因为工作的关系,经常会有处理各种数据库数据的场景,其中处理Excel 数据导出,以备客户人员确认数据,场景很常见. ...

  8. 由简入繁实现Jquery树状结构

    在项目中,我们经常会需要一些树状结构的样式来显示层级结构等,比如下图的样式,之前在学.net的时候可以直接拖个服务端控件过来直接使用非常方便.但是利用Jquery的一些插件,也是可以实现这些效果的,比 ...

  9. php实现树状结构无级分类

    php实现树状结构无级分类   ).",'树2-1-1-2')";mysql_query($sql);?>

随机推荐

  1. xe6+firedac连接sybase

    一.Win7 X64系统安装sybase odbc: 1.  下载对应包至c:\system_odbc(文件夹名自己取,在后面注册表内容需要用到): 2.  将值信息写入到注册表内: Windows ...

  2. SQLite批量插入,修改数据库 zt

    SQLiteConnection sqConnection = dataProvider.GetDbConnection(); sqConnection.Open(); SQLiteCommand s ...

  3. 强大DevExpress,Winform LookUpEdit 实现多列查询 gridview弹出下拉选择 z

    关键代码请参考http://www.devexpress.com/Support/Center/p/K18333.aspx 最新DEMO 下载 The current GridLookUpEdit's ...

  4. 学习TextKit框架(上)

    TextKit简介 在iOS7之前我们要实现图文混排要使用CoreText,iOS6时有了Attribute string 可以解决一些简单的富文本需求.直到iOS7 苹果推出了TextKit,Tex ...

  5. 双系统格式化硬盘后装XP遇到grub rescue的问题

    好奇于深度的Deepin系统,给老电脑装了xp和deepin双系统.无奈07年的机子带Deepin,实在是太卡了.正好想给硬盘重新分区,直接将硬盘格式化,重装了xp.于是,问题来了,开机显示: GRU ...

  6. 3G? 2G? 2.5G? 4G? 与 WIFI, GPRS,CDMA 3G无线上网

    首先说说无线上网有哪几种形式? WIFI, GPRS, CDMA 3G无线上网 1>wifi全称wireless fidelity,是当今使用最广的一种无线网络传输技术.实际上就是把有线网络信号 ...

  7. Python脚本调用C#代码数据交互示例(hello world)

    原地址: http://www.djangochina.cn/forum.php?mod=viewthread&tid=247 随着项目的逐渐收尾, 对IronPython脚本也越来越熟悉,这 ...

  8. Cloud Insight 客户案例-晨芯时代科技有限公司

    在不断迭代的过程中,Cloud Insight 也很重视客户对产品的使用体验,这次我们拜访了晨芯时代,了解到他们在使用 Cloud Insight 过程中对产品的一些想法. 客户背景 晨芯时代是一家开 ...

  9. 【HDU 4372】 Count the Buildings (第一类斯特林数)

    Count the Buildings Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

  10. 使用solrj进行DIH操作

    背景说明:在一个项目中需要将Mongodb中的数据导入到solr中完成搜索.在solr中Mysql数据库有对应的DIH包,可以通过配置sql语句完成数据的导入.Mongodb下也有开源的工具用来实现数 ...