树的基本操作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:用一个栈保存从头到尾访问链表的每个结点的值,然后按出栈顺序将各个值存入 ...
随机推荐
- MYSQL--事务处理
1.用begin,rollback,commit来实现 begin 开始一个事务 rollback 事务回滚 commit 事务确认 2.直接用set来改变mysql的自动提交模式 MYSQL默认是 ...
- spinlock自旋锁de使用
Linux内核中最常见的锁是自旋锁.一个自旋锁就是一个互斥设备,它只能有两个值:"锁定"和"解锁".如果锁可用,则"锁定"位被设置,而代码继 ...
- iOS 8.3 JB ready
Hi, I've been waiting for a very very long time..Now iOS 8.3 is ready. http://www.taig.com/ You guys ...
- java值得注意的几个问题
1.一个源文件中只能有一个类是public的,其他的都是默认权限的: 2.一个类只能作为public或者默认权限(就是没有修饰符的意思): 3.源文件的public类的名字必须要跟文件名保持一致,否则 ...
- 个人博客实现Archives查询小记
这两天正在做博客,刚刚遇到一个问题,就是需要在主页实现文档分类功能,即通过日期将文章进行按日期进行分类. 比如这样的: 我个人的想法是,查询所有文章的日期,然后将日期进行格式化,只留下年份和月份,然后 ...
- C#反射动态调用dll中的方法
//加载程序集(dll文件地址),使用Assembly类 Assembly assembly = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirec ...
- Custom PeopleSoft Queries
The following SQL identifies custom queries created in your system from the PSQRYDEFN PeopleTools ...
- [leetcode]_Pascal's Triangle II
题目:Pascal三角的变形,要求只用O(K)的额外空间. 思路:由于Pascal三角中,tri[n][i] = tri[n - 1][i] + tri[n-1][i-1],(通常情况下) 如果已经获 ...
- linux 常用命令及技巧
linux 常用命令及技巧 linux 常用命令及技巧:linux 常用命令总结: 一. 通用命令: 1. date :print or set the system date and time 2. ...
- Qt使用默认浏览器打开网页
#include <QDesktopServices> #include <QUrl> QDesktopServices::openUrl(QUrl("http:// ...