树的基本操作java版
看了一下树的定义,一些基本的操作,遍历,获取节点数,获取深度等等。。这里参考了西电版的数据结构,基本用的都是递归实现的。
很多说明代码中都有,每个方法我都测了一下,这里我把节点类BTreeNode作为内部类放到了BTree中,方便一下。其实可以拿出来。还有我用的是二叉链表实现的树的存储,因为java 不能将函数(方法)作为参数传递,所以将visit()方法封装到了Visit类中,将Visit类对象作为参数传递
BTree.java
package com.gxf.tree; /**
* 定义数的属性和一些基本操作
* @author Administrator
*
*/
public class BTree {
/**
* 树节点类
* 这里用二叉链表,存储
* @author Administrator
*
*/
class BTreeNode{
private Object data;
private BTreeNode lchild;
private BTreeNode rchild; public BTreeNode(){
lchild = null;
rchild = null;
}
public void setData(Object data){
this.data = data;
}
public void setLchild(BTreeNode lchild){
this.lchild = lchild;
}
public void setRchild(BTreeNode rchild){
this.rchild = rchild;
}
public Object getData(){
return data;
}
}
//下面是二叉树的一些属性
private Object array[];//用数组保存所有树节点的数据
private BTreeNode root;//根节点
private Visit visit = new Visit();//java 不能将函数作为函数的参数,用一个类封装方法 /**
* 构造一棵树,指向根节点
* @param array
*/
public BTree(Object array[]){
this.array = array;
root = build(1);
} /**
* 根据成员变量array[]递归构造一棵树
* 构造左子树、右子树
* @return
*/
public BTreeNode build(int i){
int n = array.length; if(i <= n){//i在数组内,说明可以构造一个以array[i]为根节点的子树
BTreeNode treeNode = new BTreeNode();
treeNode.setData(array[i - 1]);//设置根节点
treeNode.setLchild(build(2 * i));//构造左子树
treeNode.setRchild(build(2 * i + 1));//构造右子树 return treeNode;
}else{
return null;
}
}
/**
* 获取树的所有节点的个数
*/
public int getNodeNum(){
return getNodeNum(root);
}
/**
* 计算所有节点的个数
* 递归实现,左子树个数 + 右子树个数 + 1
* @param root
* @return
*/
public int getNodeNum(BTreeNode root){
if(null == root)
return 0;
else
{
return getNodeNum(root.lchild) + getNodeNum(root.rchild) + 1;
} }
/**
* 获取树的高度
* @return
*/
public int getDep(){
return getDep(root);
}
/**
* 获取树的高度
* 递归获取左右子树的高度,返回最高的那个
* root为空,返回0,说明为空树,高度为0
* 如果不为空,左子树和右子树高度较大值 +1为树的高度
* @param root
* @return
*/
public int getDep(BTreeNode root){
if(null == root)
return 0;//空树返回0,高度为0,也是函数的出口
else{
int max = getDep(root.lchild);//获取左子树的高度
if(max < getDep(root.rchild))
max = getDep(root.rchild);//获取右子树高度,并和左子树比较 return max + 1;//因为不为空树,树的高度为左右子树高度的最大值 + 1
} }
/**
* 前序遍历
*/
public void preOrder(){
preOrder(root);
}
/**
* 前序遍历树,先遍历根节点,在遍历左节点,右节点
*
* @param root
*/
public void preOrder(BTreeNode root){
if(null != root){
visit.visit(root);
preOrder(root.lchild);
preOrder(root.rchild);
}
}
/**
* 中序遍历
*/
public void inOrder(){
inOrder(root);
}
/**
* 中序遍历,县遍历左子树,根,最后遍历右子树
* 递归实现
* @param root
*/
public void inOrder(BTreeNode root){
if(null != root)
{
inOrder(root.lchild);
visit.visit(root);
inOrder(root.rchild);
}
}
/**
* 后序遍历
*/
public void postOrder(){
postOrder(root);
}
/**
* 后序遍历,先遍历左子树,右子树和根节点
* 这也用递归实现
* @param root
*/
public void postOrder(BTreeNode root){
if(null != root){//这里可以看成递归的出口
postOrder(root.lchild);
postOrder(root.rchild);
visit.visit(root);
}
} }
Visit.java
package com.gxf.tree; import com.gxf.tree.BTree.BTreeNode; public class Visit {
public void visit(BTreeNode node){
System.out.print(node.getData() + " ");
}
public void printLine(){
System.out.println();
}
}
Test.java
package com.gxf.tree; public class Test { public static void main(String[] args) {
Visit visit = new Visit(); Character array_ch[] = new Character[]{'-', '*', 'c', 'a', 'b'};
BTree tree = new BTree(array_ch);
//前序、中序和后序遍历
tree.preOrder();
visit.printLine();
tree.inOrder();
visit.printLine();
tree.postOrder();
visit.printLine();
//获取节点数和树的深度
System.out.println(tree.getNodeNum());
System.out.println(tree.getDep());
} }
测试输出
树的基本操作java版的更多相关文章
- 实现二叉树的基本操作(Java版)
近期研究了一下二叉树,试着用Java语言实现了二叉树的基本操作,下面分享一下实现代码: package com.sf.test; import java.util.ArrayDeque; import ...
- Elasticsearch 6.4基本操作 - Java版
1. Elasticsearch Java API有四类client连接方式 TransportClient RestClient Jest Spring Data Elasticsearch 其中T ...
- 《剑指offer》面试题18 树的子结构 Java版
(输入两棵二叉树A和B,判断B是不是A的子结构.补充下,根据书中的代码来看,子结构的定义并不包括叶子节点下的null,也就是说只要B的存在数字的结构存在于A中就行,那么如果B是null树,那么就不属于 ...
- 常见排序算法题(java版)
常见排序算法题(java版) //插入排序: package org.rut.util.algorithm.support; import org.rut.util.algorithm.Sor ...
- 哈夫曼树(三)之 Java详解
前面分别通过C和C++实现了哈夫曼树,本章给出哈夫曼树的java版本. 目录 1. 哈夫曼树的介绍 2. 哈夫曼树的图文解析 3. 哈夫曼树的基本操作 4. 哈夫曼树的完整源码 转载请注明出处:htt ...
- AVL树(三)之 Java的实现
概要 前面分别介绍了AVL树"C语言版本"和"C++版本",本章介绍AVL树的Java实现版本,它的算法与C语言和C++版本一样.内容包括:1. AVL树的介绍 ...
- Oracle Berkeley DB Java 版
Oracle Berkeley DB Java 版是一个开源的.可嵌入的事务存储引擎,是完全用 Java 编写的.它充分利用 Java 环境来简化开发和部署.Oracle Berkeley DB Ja ...
- 20165234 [第二届构建之法论坛] 预培训文档(Java版) 学习总结
[第二届构建之法论坛] 预培训文档(Java版) 学习总结 我通读并学习了此文档,并且动手实践了一遍.以下是我学习过程的记录~ Part1.配置环境 配置JDK 原文中提到了2个容易被混淆的概念 JD ...
- 剑指offer题解(Java版)
剑指offer题解(Java版) 从尾到头打印链表 题目描述 输入一个链表,按从尾到头的顺序返回一个ArrayList. 方法1:用一个栈保存从头到尾访问链表的每个结点的值,然后按出栈顺序将各个值存入 ...
随机推荐
- WeChat 6.3 wipe deleted chat messages as well as LINE 5.3 and above
Let me show you the WeChat version first. It is 6.3. What will happen to WeChat deleted chat message ...
- Android IOS WebRTC 音视频开发总结(三一)-- 自定义传输实现一对多
本文主要介绍基于Webrtc的多人视频会议的简单实现,文章来自博客园RTC.Blacker,支持原创,转载请说明出处. 前面提到基于开源框架的视频会议都存在诸多问题,所以我们通过重写WEBRTC传输模 ...
- THINKPHP 清除HTML注释、换行符、空格、制表符等
thinkphp3.2 3.2中取消了配置文件中的 'TMPL_STRIP_SPACE' 属性,所以我们先来修改:\ThinkPHP\Library\Think\Template.class.php ...
- SAP物料价格评估与成本计算体系
物料评估目的 核算物料领用与消耗的价值,使生产成本与产品销售成本有统一计价标准. 核算企业库存价值. 物料价格方法 移动平均价,标准价,实际价,计划价. @移动平均价: 每次物料移动后重新计算平均价, ...
- Ubuntu 14.04下java开发环境的搭建--1--JDK的安装
说明:以下内容均是本人个人经验,接触ubuntu系统是从10.04开始,转眼转眼之间已经四年了,经常浏览各种相关论坛,发现从我刚开始基础到现在,论坛上还有很多人在问关于JAVA环境配置的相关问题.所以 ...
- 搭建高性能计算环境(七)、应用软件的安装之MS
1,上传软件包MaterialsStudio70.tgz.msi_7.lic到服务器上. 2,安装ms一般会创建一个普通用户msi,软件安装在msi账号下. 创建用户msi: useradd msi ...
- 使用PyInstaller将Python程序打包成一个单独的exe文件
1. 安装步骤略过 网上教程多 2. 用cmd进入PyInstaller的目录 然后执行以下命令: python pyinstaller.py -F C:\test.py 以上命令需要把Python目 ...
- Flex 4.0及4.6发布的网络应用在内网内会访问很慢的解决方案
Flex 4.x 开发的程序部署在外网在能访问到www.adobe.com的时能够很快加载完成,但是部署在本地局域网,不能访问外网的服务器上,用浏览器访问应用需要加载几分钟的时间,这种等待时间客户几乎 ...
- Ghost命令使用方法
我们知道,一般使用Ghost时,都是在DOS提示符后先键入"Ghost",然后再进入Ghost的图形界面操作:那么可不可以让Ghost也只通过命令行的方式工作呢?答案是肯定的,在键 ...
- python基础学习笔记第二天 内建方法(s t r)
python的字符串内建函数 str.casefold()将字符串转换成小写,Unicode编码中凡是有对应的小写形式的,都会转换str.center()返回一个原字符串居中,并使用空格填充至长度 w ...