参考: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. XStream简单使用01——xml和Ojbect互转

    package org.zhb.test; /** * author : zhb * data : 2014-2-14 * use packages: * xmlpull-1.1.3.1.jar * ...

  2. JavaBean的使用

    JavaBean主要用于实现一些业务逻辑或封装一些业务对象 通常将JavaBean中的属性设置为私有的(private),但需要为其提供公共的(public)访问方法,也就是所说的getXXX()方法 ...

  3. 警惕arm-linux-gcc编译器优化选项

    arm-linux-gcc的优化选项例如(-O2),可以加速我们的程序,使程序执行效率更高.但是,倘若我们就是需要程序慢一点运行,但是优化却把我们的延时函数优化的没有了的时候,这种优化却不是我们想要的 ...

  4. why app_start start

    Add following code for your class: [assembly: WebActivatorEx.PostApplicationStartMethod(typeof(WeCha ...

  5. cmd下运行java文件时,找不到或无法加载主类的解决方法

    最近再看java,却被一个看似很基础的hellorworld头疼了十几分钟,百度了一下,若你在cmd下编辑及运行.java文件时报错,解决方案如下,如图所示:

  6. 3.2.3 使用Parameters动态生成where语句_JasperReports iRepor

    $P!{ParametersName}格式的SQL语句 来源:http://book.2cto.com/201306/24311.html#12732-hi-1-66926-020ef5b321fac ...

  7. Ubuntu修改语言环境为英文

    转自把语言环境变量改为英文 将Ubuntu系统语言环境改为英文的en_US.UTF-8 查看当前系统语言环境 locale 编辑配置文件,将zh_US.UTF-8改为en_US.UTF-8,zh改为e ...

  8. mysql优化案例

    MySQL优化案例 Mysql5.1大表分区效率测试 Mysql5.1大表分区效率测试MySQL | add at 2009-03-27 12:29:31 by PConline | view:60, ...

  9. 移动应用产品开发-android开发(二)

    这段时间实在太忙了,也没什么精力来写博客,还是没养成写博客的习惯,还是得记载下来,不然时间久了就忘记了. 早上一大早就来公司了,趁还早,拟定今天的工作内容和计划后,赶紧记载点东西. 最近做androi ...

  10. 【POJ 1639】 Picnic Planning (最小k度限制生成树)

    [题意] 有n个巨人要去Park聚会.巨人A和先到巨人B那里去,然后和巨人B一起去Park.B君是个土豪,他家的停车场很大,可以停很多车,但是Park的停车场是比较小.只能停k辆车.现在问你在这个限制 ...