- 浏览: 584835 次
- 来自: ...
文章分类
最新评论
-
lgh1992314:
相同的元素呢
一种离散化方法 -
HelloSummerR:
圆心的位置是随机的,于是圆的部分会落到canvas外,那样就显 ...
HTML5 Canvas学习笔记(1)处理鼠标事件 -
hlstudio:
好久没见到sokuban了,这有个java版的,带源码,可以参 ...
求推箱子的最小步数(java) -
肖泽文:
太好了,谢谢你。。有中文注释!
HTML5 推箱子游戏过关演示动画 -
swm8023:
删除操作,将最后一个叶子节点插入后也有可能上浮吧
彻底弄懂最大堆的四种操作(图解+程序)(JAVA)
顺序存储对完全二叉树而,简单又节省空间。对于一般二叉树,为了能用结点在数组中的相对位置表示结点之间的逻辑关系,也必须按完全二叉树的形式来存储树中的结点,这必然造成空间的浪费,随着二叉树高度的增大,空结点的数量也会急速增多。
运行:
true
[[汉献帝],[null],[null],[null],[null],[null],[null],[null],[null],[null],[null],[null],[null],[null],[null]]
现在二叉树是:
[[汉献帝],[刘备],[曹操],[关羽],[张飞],[张辽],[许褚],[null],[null],[null],[null],[null],[null],[null],[null]]
刘备的左手是: 关羽
汉献帝的右手是:曹操
张飞的上司是:刘备
false
下载源码:
/** * 顺序二叉树 * * @author liuyan */ public class ArrayBinaryTree<T> { // 节点数组 private Object[] datas; // 指定的树的深度 private int treeDeep; // datas数组的实际大小 private int arraySize; /** * 默认构造函数 */ public ArrayBinaryTree() { // 设置默认的树深度 treeDeep = 4; arraySize = (int) Math.pow(2, 4) - 1; datas = new Object[arraySize]; } /** * 指定深度构建二叉树 * @param deep */ public ArrayBinaryTree(int deep) { // 按指定深度 treeDeep = deep; arraySize = (int) Math.pow(2, treeDeep) - 1; datas = new Object[arraySize]; } /** * 指定深度和指定根节点构建二叉树 * @param deep * @param data */ public ArrayBinaryTree(int deep, T data) { // 按指定深度 treeDeep = deep; arraySize = (int) Math.pow(2, treeDeep) - 1; datas = new Object[arraySize]; datas[0] = data; } /** * 为下标是index的节点增加子节点 * @param index * @param data * @param isLeft * @return */ public boolean addNode(int index, T data, boolean isLeft) { if (index * 2 + 2 > arraySize-1 || datas[index] == null) { throw new RuntimeException("下标无效"); } if (isLeft) { datas[index * 2 + 1] = data; } else { datas[index * 2 + 2] = data; } return true; } /** * 判断二叉树是否为空 * * @return */ public boolean isEmpty() { for(int i=0;i<datas.length;i++) if(datas[i]!=null) return false; return true; } /** * 返回根节点 * * @return */ @SuppressWarnings("unchecked") public T getRoot() { return (T) datas[0]; } /** * 返回指定节点的父节点 * @return */ @SuppressWarnings("unchecked") public T getParent(int index) { if (index > arraySize-1 || datas[index] == null) { throw new RuntimeException("下标无效"); } if (datas[(index - 1) / 2] == null) { throw new RuntimeException("无父节点"); } return (T) datas[(index - 1) / 2]; } /** * 返回左子节点 * @return */ @SuppressWarnings("unchecked") public T getLeftNode(int index) { if (index * 2 + 1 > (arraySize-1) || datas[index] == null) { throw new RuntimeException("下标无效"); } return (T) datas[index * 2 + 1]; } /** * 返回右子节点 * @return */ @SuppressWarnings("unchecked") public T getRightNode(int index) { if (index * 2 + 2 > (arraySize-1) || datas[index] == null) { throw new RuntimeException("下标无效"); } return (T) datas[index * 2 + 2]; } /** * 返回树的深度 * @return */ public int getTreeDeep() { return treeDeep; } /** * 返回指定节点的索引位置 * @param data * @return */ public int getNodeIndex(T data) { for (int i = 0; i < arraySize; i++) { if (data == datas[i]) { return i; } } return -1; } @Override public String toString() { StringBuffer str = new StringBuffer("["); for (int i = 0; i < datas.length; i++) { str.append("[" + datas[i] + "],"); } if (datas.length > 0) { return str.substring(0, str.lastIndexOf(",")) + "]"; } return str.append("]").toString(); } //测试代码如下 public static void main(String[] args) { ArrayBinaryTree<String> arrayBinaryTree1 = new ArrayBinaryTree<String>(4); System.out.println(arrayBinaryTree1.isEmpty()); ArrayBinaryTree<String> arrayBinaryTree = new ArrayBinaryTree<String>(4,"汉献帝"); System.out.println(arrayBinaryTree); arrayBinaryTree.addNode(0, "刘备", true); arrayBinaryTree.addNode(0, "曹操", false); arrayBinaryTree.addNode(1, "关羽", true); arrayBinaryTree.addNode(1, "张飞", false); arrayBinaryTree.addNode(2, "张辽", true); arrayBinaryTree.addNode(2, "许褚", false); System.out.println("现在二叉树是:"); System.out.println(arrayBinaryTree); System.out.println(); System.out.print("刘备的左手是: "); System.out.println(arrayBinaryTree.getLeftNode(1)); System.out.print("汉献帝的右手是:"); System.out.println(arrayBinaryTree.getRightNode(0)); System.out.println(); System.out.print("张飞的上司是:"); System.out.println(arrayBinaryTree.getParent(4)); System.out.println(arrayBinaryTree.isEmpty()); } }
运行:
true
[[汉献帝],[null],[null],[null],[null],[null],[null],[null],[null],[null],[null],[null],[null],[null],[null]]
现在二叉树是:
[[汉献帝],[刘备],[曹操],[关羽],[张飞],[张辽],[许褚],[null],[null],[null],[null],[null],[null],[null],[null]]
刘备的左手是: 关羽
汉献帝的右手是:曹操
张飞的上司是:刘备
false
下载源码:
- ArrayBinaryTree.zip (1.4 KB)
- 下载次数: 4
发表评论
-
求二叉树上任意两个节点的最近公共父节点
2013-01-09 10:24 2330北大百练题2756: 如上图所示,由正整数1, 2 ... -
JAVA判断二叉树是否是二叉平衡树
2013-01-07 18:59 1949import java.util.*; ... -
大顶堆应用:POJ2010
2012-12-23 20:59 1831POJ2010题意: 奶牛学校招生,c头奶牛报名,要选 ... -
二维树状数组学习之二:练习POJ 1195
2012-12-12 21:40 1357接前文:二维树状数组学习之一:彻底理解http://128kj ... -
二维树状数组学习之一:彻底理解
2012-12-12 20:54 2421当要频繁的对数组元素进行修改,同时又要频繁的查询数组内 ... -
图的深搜+树状数组练习 POJ 3321(JAVA)
2012-12-11 11:13 1770关于树状数组:参看:http://128kj.iteye.co ... -
树状数组练习:POJ 3067
2012-12-09 17:10 1677关于树状数组,参看:http://128kj.iteye.co ... -
树状数组练习:POJ 2481(JAVA)
2012-12-08 18:11 1755关于树状数组,请参考:http://128kj.iteye.c ... -
初步了解树状数组
2012-12-07 14:18 1705一、树状数组是干什么的? 平常我们会遇到一些对数组进 ... -
线段树求逆序数(离散化)POJ 2299
2012-12-06 08:25 2025POJ2299题意: 给出长度为n的序列,每次只能交换 ... -
利用线段树求逆序数(JAVA)
2012-12-04 22:46 2488设A[1…n]是一个包含n个不同数的数组。如果在i< ... -
线段树入门学习(三)懒操作(兼解POJ1823) JAVA
2012-12-02 15:37 2036继续上文"线段树入门学习(二)" ht ... -
线段树入门学习(二)(兼解POJ3468) JAVA
2012-11-30 16:55 2501继续上文http://128kj.iteye. ... -
线段树入门学习(兼解HDU1754)
2012-11-30 11:24 2605先看网上的介绍: 线段树也叫区间树,顾名思义,线段树是 ... -
AVL树及JAVA实现
2012-11-26 16:34 2220一棵AVL树是其每个节点的左子树和右子树的高度最多差1的二 ... -
图解平衡二叉树
2012-11-26 11:34 2014形态匀称的二叉树 ... -
深度优先遍历字典树(统计单词出现的个数)
2012-11-23 22:18 2789例:给出一个字符文本,每行一个字符串,统计不同的字符串出现的百 ... -
学习使用字典树(JAVA)
2012-11-22 09:25 2062字典树 又称单词 ... -
彻底弄懂最大堆的四种操作(图解+程序)(JAVA)
2012-11-17 21:50 18578堆有最大堆和最小堆之分,最大堆就是每个节点的值都>= ... -
并查集入门精讲,实例2个(JAVA)
2012-10-30 14:47 3989一、什么是并查集 ...
相关推荐
Java实现二叉树的3种方式,顺序二叉树的实现,二叉树的三叉链表存储,二叉树的二叉链表实现
分别采用二叉链表和顺序表作存储结构,实现对二叉排序树与平衡二叉树的操作。 重庆理工大学,软件工程系,课程设计。
JAVA数据结构和算法,经典java算法书籍,完美中文版哟
学生成绩管理系统---使用数据结构中的二叉树排序,利用数据库实现学生查询、删除、修改信息、按学号或班级或课程成绩查询学生信息等。主要是字符界面显示
用Java实现【顺序存储二叉树】 从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组
(1)一棵度为2 的树与一棵二叉树有何区别?树与二叉树之间有何区别? 【解答】 ①二叉树是有序树,度为 2 的树是...1)它的顺序存储结构示意图; 2)它的二叉链表存储结构示意图; 3)它的三叉链表存储结构示意图。
Java实现如下算法: 1.链表 链表用来存储数据,由一系列的结点组成。这些结点的物理地址不一定是连续的,即可能连续,也可能不连续,但链表里的结点是有序的。一个结点由数据的值和下一个数据的地址组成。一个链表...
(1)顺序表的特点及存储结构 (2)链表的特点及存储结构 (3)栈的特点及基本操作 (4)队列的特点及基本操作 (5)顺序串和链串的存储结构 (6)二维数组的地址计算 (7)稀疏矩阵的概念及存储结构 (8)线性表的...
**章 算法和实现算法的Java语法 1.1 建立算法初步概念 1.1.1 什么是算法 1.1.2 算法的发展历史 1.1.3 算法的分类 1.2 算法相关概念的区别 1.2.1 算法与公式的关系 1.2.2 算法与程序的关系 1.2.3 算法与数据结构的...
逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何...
12.线性表的顺序存储结构和线性表的链式存储结构分别是(随机存取的存储结构、顺序存取的存储结构) 13.树是结点的集合,它的根结点数目是(有且只有1) 14.在深度为5的满二叉树中,叶子结点的个数为(31) 15.具有3...
5、说明生活中遇到的二叉树,用java实现二叉树 66 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序: 71 7、写一个Singleton出来。 75 8、递归算法题1 77 9、递归...
5、说明生活中遇到的二叉树,用java实现二叉树 66 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序: 71 7、写一个Singleton出来。 75 8、递归算法题1 77 9、递归...
用JAVA实现一个快速排序。 40 59. 请对以下在J2EE中常用的名词进行解释(或简单描述) 40 59.1. web 容器 40 59.2. EJB容器 40 59.3. JNDI 40 59.4. JMS 41 59.5. JTA 41 59.6. JAF 41 59.7. RMI/IIOP 41 60. JAVA语言...
5、说明生活中遇到的二叉树,用java实现二叉树 66 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序: 71 7、写一个Singleton出来。 75 8、递归算法题1 77 9、递归...
各数据节点的存储空间可以不连续,但它们的存储顺序与逻辑顺序必须一致 B.各数据节点的存储顺序与逻辑顺序可以不一致,但它们的存储空间必须连续 C.进行插入与删除时,不需要移动表中的元素 D.以上三种说法都不对 ...
若某线性表中最常用的操作是取第I个元素和找第I个元素的前趋元素,则采用___存储方式最节省时间。 A、顺序表 B、单链表 C、双链表 D、单循环链表 C 2.设在栈中,由顶向下已存放元素c、b、a,在第4个元素d入栈之前...
逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何...