`
128kj
  • 浏览: 600327 次
  • 来自: ...
社区版块
存档分类
最新评论

二叉树的顺序存储实现(java)

阅读更多
  顺序存储对完全二叉树而,简单又节省空间。对于一般二叉树,为了能用结点在数组中的相对位置表示结点之间的逻辑关系,也必须按完全二叉树的形式来存储树中的结点,这必然造成空间的浪费,随着二叉树高度的增大,空结点的数量也会急速增多。
 
/**
 * 顺序二叉树
 * 
 * @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

下载源码:
分享到:
评论

相关推荐

    二叉树的基本操作(java实现)

    本项目是用Java语言实现的二叉树基本操作,主要涉及以下知识点: 1. **二叉树节点类** (BinNode.java) - 一个二叉树节点通常包含三个属性:`value`(存储节点的值),`leftChild`(指向左子节点的引用)和`right...

    二叉树的遍历-java

    在Java中,实现这些遍历方法可以使用`Node`类来表示二叉树的节点,包含节点值、左子节点和右子节点。对于递归版本,可以直接在方法内实现;对于非递归版本,可以使用`java.util.Stack`来辅助实现。 例如,对于前序...

    用java语言实现的二叉树,输入英文字母,按字母表顺序输出

    本话题将详细介绍如何使用Java语言来实现一个二叉树,并使其能够接收英文字母作为输入,按照字母表顺序进行输出。 首先,我们需要定义一个表示二叉树节点的类。这个类通常包含三个属性:存储数据的字段(在这里是...

    Java实现二叉树,Java实现队列.pdf

    在给定文件内容中,涉及了Java编程语言中二叉树和队列的实现方法。本文将详细介绍这些概念,并且提供相关的代码实现知识点。 首先,我们来看二叉树的实现。二叉树是每个节点最多有两个子树的树结构,通常子树被称作...

    二维矩形装箱算法--二叉树--java实现.rar

    Java实现时,可以定义一个`Rectangle`类来存储矩形的信息,如宽、高、位置等。同时,构建一个`Node`类来表示二叉树的节点,包含矩形信息以及指向子节点的引用。利用Java的面向对象特性,可以方便地实现二叉树的插入...

    JAVA二叉树课设可以实现用户输入数据以二叉树图形表示出来

    【JAVA实现】 在Java中,二叉树的实现通常涉及定义一个Node类,包含数据元素、左右子节点的引用。然后定义一个BinaryTree类,包含对树的各种操作方法,如insert()、delete()、find()、traverse()等。此外,为了实现...

    java实现的二叉树源码

    下面我们将详细讨论在给定的“java实现的二叉树源码”中涉及的知识点。 1. **节点(Node)**: 节点是二叉树的基本构建单元,通常包含两个子节点(左子节点和右子节点)以及一个存储数据的属性。在`Node.java`文件中,...

    Java二叉树中序遍历

    本课程设计将详细介绍如何使用Java编程语言实现二叉树的中序遍历。 首先,我们先构建二叉树的节点类(Node),它包含一个数据字段(data)以及指向左子节点(left)和右子节点(right)的引用: ```java public ...

    Java创建二叉树的3种方式

    总结起来,Java中创建二叉树有顺序存储、三叉链表存储和二叉链表实现三种方式,每种都有其适用场景和优缺点。选择哪种方式取决于具体需求,如空间效率、操作复杂度和内存布局等因素。理解这些方法有助于更好地利用...

    JAVA实现二叉树建立、遍历

    Java作为一种强大的面向对象编程语言,提供了丰富的数据结构支持,包括二叉树的实现。 首先,我们来看如何通过先序和中序序列建立二叉树。先序遍历顺序是:根节点 -&gt; 左子树 -&gt; 右子树;中序遍历顺序是:左子树 -&gt; ...

    Java实现二叉树的层次遍历

    本篇文章将详细探讨如何实现二叉树的层次遍历,即按照从根节点到叶子节点的层次顺序访问所有节点。 首先,我们需要定义二叉树节点的数据结构。在`BinaryTree.java`文件中,我们可以创建一个名为`Node`的类来表示树...

    java 二叉排序树与平衡二叉树的实现

    2. **顺序表存储结构**:对于较小的数据集,可以考虑使用数组来实现二叉排序树,这样可以直接通过索引访问元素,但插入和删除操作可能需要更多的移动操作。 3. **插入操作**:在二叉排序树中插入一个新节点,需要...

    xml实现二叉树排序

    7. **应用和扩展**:这个实现不仅可以用于排序和存储数据,还可以用于其他场景,如数据交换、序列化和恢复二叉树状态。通过XML,数据可以在不同的系统和平台之间共享和交换。 总之,通过XML实现二叉树排序是一种...

    java语言实现二叉树的各种操作

    本文将详细讲解如何使用Java实现二叉树的各种操作,包括树的创建、查找、删除、按层遍历、输出所有路径以及中序遍历。 1. **树的创建**: 创建二叉树首先需要定义一个二叉树节点类,该类通常包含三个属性:一个...

    数据结构第六章课件及建立二叉树的二叉链表存储结构汇总

    "构建二叉树的二叉链表存储结构.doc" 文件可能详细介绍了如何通过给定的节点顺序来创建二叉链表,这通常涉及到递归或栈的数据结构。递归方法通常用于前序遍历构建,而栈则适用于其他两种遍历方式。在构建过程中,...

    Creat BTree.rar_btree_btree java_creatBtree_java 二叉树_二叉树 程序

    这里我们关注的是“创建二叉树”的Java程序,这涉及到对二叉树概念的理解,以及如何用Java语言来实现它。 首先,我们要理解什么是二叉树。二叉树是每个节点最多有两个子节点的树形数据结构,通常分为左子节点和右子...

    java版数据结构的 算术表达式与二叉树源码

    Java作为一种流行的编程语言,被广泛用于实现各种数据结构,包括二叉树。本篇将详细讲解基于Java的算术表达式与二叉树相关的知识点。 一、算术表达式与二叉树 1. **中缀表达式**:我们日常接触的算术表达式通常是...

Global site tag (gtag.js) - Google Analytics