树的基本操作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:用一个栈保存从头到尾访问链表的每个结点的值,然后按出栈顺序将各个值存入 ...
随机推荐
- iOS 支付宝支付集成获取私钥
http://doc.open.alipay.com/doc2/apiList?docType=4 登录到支付宝开放平台,下载相关支付宝支付的demo.解压出来有3个文件夹.(服务端demo,客户端 ...
- 模拟cpu调度
先来先服务实现简单但是平均周转时间过长 短作业优先算法缩短了平均周转时间 #!/usr/bin/python #-*- coding: utf-8 -*- # # table # 0:进程号 1:到达 ...
- JS创建对象的方式
1.采用直接量创建方式:系统会使用new方式自动创建对象 var o = {x:1,y:2,z:2}; 2.采用new关键字创建对象:采用构造函数创建对象 var o = new Object();/ ...
- 代码快捷键的设置读取App.config方法
附件下载:http://files.cnblogs.com/files/qtiger/ShortcutAchieve.zip 代码实现最重要(增加引用using System.Configuratio ...
- [leetcode]_Palindrome Number
判断integer是否为回文串(负数全部不为回文串) 思路很直接,提取出integer中的每一位,一头一尾进行比较是否相同. 一次AC , 直接上代码: public boolean isPalind ...
- Crystal Report在.net中的两种显示方式
Crystal Report在.net中的两种显示方式 编写人:CC阿爸 2014-7-29 近来在完成深圳一公司的项目,对方对各方面要求相当严格,一不满意就拒绝签收,为了对修正水晶报表显示及导出的一 ...
- Silverlight IIs发布问题
1.在IIS上部署系统没有问题,在vs中链接oracle中出错(数据连接不成功,请检查该数据库是否已启动尝试加载oracle客户端时引发BadImageFormatException.如果在安装32位 ...
- NodeManager起不来
NodeManager无法启动,解除授权,重新授权! CDH需要注意的表: SELECT * FROM `ROLES` SELECT * FROM CONFIGS WHERE attr LIKE '% ...
- Head First-观察者模式
什么是观察者模式?观察者模式定义了对象之间一对多的关系. 观察者模式中有主题(即可观察者)和观察者.主题用一个共同的接口来通知观察者,主题不知道观察者的细节,只知道观察者实现了主题的接口. 普遍的观察 ...
- Nginx Location配置语法介绍、优先级说明
nginx 语法规则:location [=|~|~*|^~|!~|!~*] /uri/ { … } location匹配的是$document_uri,$document_uri 会随 ...