看了一下树的定义,一些基本的操作,遍历,获取节点数,获取深度等等。。这里参考了西电版的数据结构,基本用的都是递归实现的。

很多说明代码中都有,每个方法我都测了一下,这里我把节点类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版的更多相关文章

  1. 实现二叉树的基本操作(Java版)

    近期研究了一下二叉树,试着用Java语言实现了二叉树的基本操作,下面分享一下实现代码: package com.sf.test; import java.util.ArrayDeque; import ...

  2. Elasticsearch 6.4基本操作 - Java版

    1. Elasticsearch Java API有四类client连接方式 TransportClient RestClient Jest Spring Data Elasticsearch 其中T ...

  3. 《剑指offer》面试题18 树的子结构 Java版

    (输入两棵二叉树A和B,判断B是不是A的子结构.补充下,根据书中的代码来看,子结构的定义并不包括叶子节点下的null,也就是说只要B的存在数字的结构存在于A中就行,那么如果B是null树,那么就不属于 ...

  4. 常见排序算法题(java版)

    常见排序算法题(java版) //插入排序:   package org.rut.util.algorithm.support;   import org.rut.util.algorithm.Sor ...

  5. 哈夫曼树(三)之 Java详解

    前面分别通过C和C++实现了哈夫曼树,本章给出哈夫曼树的java版本. 目录 1. 哈夫曼树的介绍 2. 哈夫曼树的图文解析 3. 哈夫曼树的基本操作 4. 哈夫曼树的完整源码 转载请注明出处:htt ...

  6. AVL树(三)之 Java的实现

    概要 前面分别介绍了AVL树"C语言版本"和"C++版本",本章介绍AVL树的Java实现版本,它的算法与C语言和C++版本一样.内容包括:1. AVL树的介绍 ...

  7. Oracle Berkeley DB Java 版

    Oracle Berkeley DB Java 版是一个开源的.可嵌入的事务存储引擎,是完全用 Java 编写的.它充分利用 Java 环境来简化开发和部署.Oracle Berkeley DB Ja ...

  8. 20165234 [第二届构建之法论坛] 预培训文档(Java版) 学习总结

    [第二届构建之法论坛] 预培训文档(Java版) 学习总结 我通读并学习了此文档,并且动手实践了一遍.以下是我学习过程的记录~ Part1.配置环境 配置JDK 原文中提到了2个容易被混淆的概念 JD ...

  9. 剑指offer题解(Java版)

    剑指offer题解(Java版) 从尾到头打印链表 题目描述 输入一个链表,按从尾到头的顺序返回一个ArrayList. 方法1:用一个栈保存从头到尾访问链表的每个结点的值,然后按出栈顺序将各个值存入 ...

随机推荐

  1. linux 编译,链接和加载

    1.   序 最近在折腾各种.so,碰到了一些问题,一开始对于很多错误也没有头绪,茫然不知所措.索性化了一天多时间将<<程序员的自我修养—链接.装载与库>>中部分内容略读了一遍 ...

  2. 第九周java学习总结

    20145306<java程序设计>第九周学习总结 教材学习内容总结 第十六章 一.JDBC入门 1.JDBC简介 JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据 ...

  3. poj3020

    define     n    the number of  ' * ' define     d    the number of couple of two points define     s ...

  4. IIS7 配置URL_REWRITE

    webconfig 文件 system.webServer节点下配置rewrite 报错 是因为需要安装URL重写 需要安装: https://www.microsoft.com/zh-cn/down ...

  5. MVC_学习笔记_2_Authorize

    MVC5_学习笔记_2_Authorize/* GitHub stylesheet for MarkdownPad (http://markdownpad.com) *//* Author: Nico ...

  6. CentOS学习笔记--基本命令--文件与目录管理

    Linux基本命令--文件与目录管理 本节节选自鸟哥的 Linux 私房菜 -- 基础学习篇目录  第七章.Linux 文件与目录管理  ls(文件与目录的检视) ls命令就是list的缩写,ls可以 ...

  7. 修改Hosts后对火狐不起作用解决办法

    修改Hosts后对火狐不起作用: 重启火狐浏览器仍不起作用的话,执行下面操作即可. FireFox - 选项 - 高级 - 网络 - 立即清除(缓存)  就解决了

  8. C#中的快捷键,可以更方便的编写代码 (转载)

    C#中的快捷键,可以更方便的编写代码 CTRL + SHIFT + B 生成解决方案 CTRL + F7 生成编译 CTRL + O 打开文件 CTRL + SHIFT + O 打开项目 CTRL + ...

  9. javascript回车完美实现tab切换功能

    javascript通过回车实现tab切换功能,最经有一个项目是给化工厂做的在使用的过程中需要输入大量的数据,使用的都是小键盘区,在以前都是通过excel录入数据的现在, 在网页上需要实现excel ...

  10. 获取php的配置

    ini_get — 获取一个配置选项的值 返回值 成功是返回配置选项值的字符串,null 的值则返回空字符串.如果配置选项不存在,将会返回 FALSE. <?php /* 我们的 php.ini ...