- 浏览: 600327 次
- 来自: ...
文章分类
最新评论
-
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 2392北大百练题2756: 如上图所示,由正整数1, 2 ... -
JAVA判断二叉树是否是二叉平衡树
2013-01-07 18:59 1985import java.util.*; ... -
大顶堆应用:POJ2010
2012-12-23 20:59 1887POJ2010题意: 奶牛学校招生,c头奶牛报名,要选 ... -
二维树状数组学习之二:练习POJ 1195
2012-12-12 21:40 1395接前文:二维树状数组学习之一:彻底理解http://128kj ... -
二维树状数组学习之一:彻底理解
2012-12-12 20:54 2466当要频繁的对数组元素进行修改,同时又要频繁的查询数组内 ... -
图的深搜+树状数组练习 POJ 3321(JAVA)
2012-12-11 11:13 1818关于树状数组:参看:http://128kj.iteye.co ... -
树状数组练习:POJ 3067
2012-12-09 17:10 1807关于树状数组,参看:http://128kj.iteye.co ... -
树状数组练习:POJ 2481(JAVA)
2012-12-08 18:11 1816关于树状数组,请参考:http://128kj.iteye.c ... -
初步了解树状数组
2012-12-07 14:18 1771一、树状数组是干什么的? 平常我们会遇到一些对数组进 ... -
线段树求逆序数(离散化)POJ 2299
2012-12-06 08:25 2090POJ2299题意: 给出长度为n的序列,每次只能交换 ... -
利用线段树求逆序数(JAVA)
2012-12-04 22:46 2568设A[1…n]是一个包含n个不同数的数组。如果在i< ... -
线段树入门学习(三)懒操作(兼解POJ1823) JAVA
2012-12-02 15:37 2114继续上文"线段树入门学习(二)" ht ... -
线段树入门学习(二)(兼解POJ3468) JAVA
2012-11-30 16:55 2542继续上文http://128kj.iteye. ... -
线段树入门学习(兼解HDU1754)
2012-11-30 11:24 2692先看网上的介绍: 线段树也叫区间树,顾名思义,线段树是 ... -
AVL树及JAVA实现
2012-11-26 16:34 2288一棵AVL树是其每个节点的左子树和右子树的高度最多差1的二 ... -
图解平衡二叉树
2012-11-26 11:34 2060形态匀称的二叉树 ... -
深度优先遍历字典树(统计单词出现的个数)
2012-11-23 22:18 2850例:给出一个字符文本,每行一个字符串,统计不同的字符串出现的百 ... -
学习使用字典树(JAVA)
2012-11-22 09:25 2129字典树 又称单词 ... -
彻底弄懂最大堆的四种操作(图解+程序)(JAVA)
2012-11-17 21:50 18698堆有最大堆和最小堆之分,最大堆就是每个节点的值都>= ... -
并查集入门精讲,实例2个(JAVA)
2012-10-30 14:47 4043一、什么是并查集 ...
相关推荐
本项目是用Java语言实现的二叉树基本操作,主要涉及以下知识点: 1. **二叉树节点类** (BinNode.java) - 一个二叉树节点通常包含三个属性:`value`(存储节点的值),`leftChild`(指向左子节点的引用)和`right...
在Java中,实现这些遍历方法可以使用`Node`类来表示二叉树的节点,包含节点值、左子节点和右子节点。对于递归版本,可以直接在方法内实现;对于非递归版本,可以使用`java.util.Stack`来辅助实现。 例如,对于前序...
本话题将详细介绍如何使用Java语言来实现一个二叉树,并使其能够接收英文字母作为输入,按照字母表顺序进行输出。 首先,我们需要定义一个表示二叉树节点的类。这个类通常包含三个属性:存储数据的字段(在这里是...
在给定文件内容中,涉及了Java编程语言中二叉树和队列的实现方法。本文将详细介绍这些概念,并且提供相关的代码实现知识点。 首先,我们来看二叉树的实现。二叉树是每个节点最多有两个子树的树结构,通常子树被称作...
Java实现时,可以定义一个`Rectangle`类来存储矩形的信息,如宽、高、位置等。同时,构建一个`Node`类来表示二叉树的节点,包含矩形信息以及指向子节点的引用。利用Java的面向对象特性,可以方便地实现二叉树的插入...
【JAVA实现】 在Java中,二叉树的实现通常涉及定义一个Node类,包含数据元素、左右子节点的引用。然后定义一个BinaryTree类,包含对树的各种操作方法,如insert()、delete()、find()、traverse()等。此外,为了实现...
下面我们将详细讨论在给定的“java实现的二叉树源码”中涉及的知识点。 1. **节点(Node)**: 节点是二叉树的基本构建单元,通常包含两个子节点(左子节点和右子节点)以及一个存储数据的属性。在`Node.java`文件中,...
本课程设计将详细介绍如何使用Java编程语言实现二叉树的中序遍历。 首先,我们先构建二叉树的节点类(Node),它包含一个数据字段(data)以及指向左子节点(left)和右子节点(right)的引用: ```java public ...
总结起来,Java中创建二叉树有顺序存储、三叉链表存储和二叉链表实现三种方式,每种都有其适用场景和优缺点。选择哪种方式取决于具体需求,如空间效率、操作复杂度和内存布局等因素。理解这些方法有助于更好地利用...
Java作为一种强大的面向对象编程语言,提供了丰富的数据结构支持,包括二叉树的实现。 首先,我们来看如何通过先序和中序序列建立二叉树。先序遍历顺序是:根节点 -> 左子树 -> 右子树;中序遍历顺序是:左子树 -> ...
本篇文章将详细探讨如何实现二叉树的层次遍历,即按照从根节点到叶子节点的层次顺序访问所有节点。 首先,我们需要定义二叉树节点的数据结构。在`BinaryTree.java`文件中,我们可以创建一个名为`Node`的类来表示树...
2. **顺序表存储结构**:对于较小的数据集,可以考虑使用数组来实现二叉排序树,这样可以直接通过索引访问元素,但插入和删除操作可能需要更多的移动操作。 3. **插入操作**:在二叉排序树中插入一个新节点,需要...
7. **应用和扩展**:这个实现不仅可以用于排序和存储数据,还可以用于其他场景,如数据交换、序列化和恢复二叉树状态。通过XML,数据可以在不同的系统和平台之间共享和交换。 总之,通过XML实现二叉树排序是一种...
本文将详细讲解如何使用Java实现二叉树的各种操作,包括树的创建、查找、删除、按层遍历、输出所有路径以及中序遍历。 1. **树的创建**: 创建二叉树首先需要定义一个二叉树节点类,该类通常包含三个属性:一个...
"构建二叉树的二叉链表存储结构.doc" 文件可能详细介绍了如何通过给定的节点顺序来创建二叉链表,这通常涉及到递归或栈的数据结构。递归方法通常用于前序遍历构建,而栈则适用于其他两种遍历方式。在构建过程中,...
这里我们关注的是“创建二叉树”的Java程序,这涉及到对二叉树概念的理解,以及如何用Java语言来实现它。 首先,我们要理解什么是二叉树。二叉树是每个节点最多有两个子节点的树形数据结构,通常分为左子节点和右子...
Java作为一种流行的编程语言,被广泛用于实现各种数据结构,包括二叉树。本篇将详细讲解基于Java的算术表达式与二叉树相关的知识点。 一、算术表达式与二叉树 1. **中缀表达式**:我们日常接触的算术表达式通常是...