`
lbxhappy
  • 浏览: 308085 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAV 数组 二叉树实现

 
阅读更多

package com.data.struct.tree.binaryTree;

 

public class ArrayBinTree<T extends Comparable<T>> {

/* 树高度 */

private int deepth = 0;

/* 存储树结构数据 */

private Object[] arr ;

/* 数组大小 */

private int size = 0;

public ArrayBinTree(int dpth,T data){

this.deepth = dpth;

init(data);

}

 

private void init(T data){

this.size = (int)Math.pow(2, this.deepth)-1;

this.arr = new Object[this.size];

this.arr[0]=data;

}

 

public int[] getNodeIndexBydepth(int h){

int len=(int)Math.pow(2, h-1);

int[] tmparr = new int[len];

int start=0;

if(h>1){

start =(int)Math.pow(2, h-1)-1;

}

for(int i=0;i<len;i++){

 

tmparr[i]=start;

start++;

}

//for(int i=0;i<len;i++){

//System.out.print(tmparr[i]);System.out.print(",");

//}

//System.out.println("-----------");

// 

return tmparr;

}

 

 

/**

* 在父节点添加子节点

* @param parentIndex

* @param data

* @param isLeft

*/

public int addNode(int parentIndex,T data,boolean isLeft){

int index=0;

if(parentIndex<0){

throw new IllegalArgumentException("不合法的父节点");

}

if(((parentIndex)*2+2)>=arr.length){

throw new IndexOutOfBoundsException("数组越界!");

}

if(isLeft){

index=parentIndex*2+1;

this.arr[parentIndex*2+1]=data;

}else{

index=parentIndex*2+2;

this.arr[(parentIndex)*2+2]=data;

}

return index;

}

/**

* 判断书是否为空

* @return

*/

public boolean isEmpty(){

if(arr[0]==null){

return true;

}else{

return false;

}

}

/**

* 根据父节点去取子节点信息

* @param parentIndex

* @param isLeft

* @return

*/

@SuppressWarnings({"unchecked"})

public T getSubNode(int parentIndex,boolean isLeft){

if(parentIndex<0){

throw new IllegalArgumentException("不合法的父节点");

}

if(((parentIndex)*2+2)>=arr.length){

throw new IndexOutOfBoundsException("数组越界!");

}

if(isLeft){

parentIndex = parentIndex*2+1;

}else{

parentIndex = parentIndex*2+2;

}

return (T)this.arr[parentIndex];

}

/**

* 返回根节点

*/

@SuppressWarnings( { "unchecked" })

public T getRootNode(){

return (T)this.arr[0];

}

/**

* 根据子节点获取父节点信息

* @param index

* @return

*/

@SuppressWarnings({"unchecked"})

public T getParentNode(int index){

if(index>=this.arr.length){

throw new IndexOutOfBoundsException("数组越界!");

}

index = index/2;

return (T)this.arr[index];

}

/**

* 树的大小

* @return

*/

public int getTreeSize(){

return this.arr.length;

}

/**

* 根据名称查找节点索引

* @param obj

* @return

*/

public int getNodeIndex(T obj){

for(int i=0;i<arr.length;i++){

if(this.arr[i]!=null && this.arr[i].equals(obj)){

return i;

}

}

return -1;

}

public Object[] getNodesByDpth(int h){

 

int tmparr[]=getNodeIndexBydepth(h);

Object[] arr2=new Object[tmparr.length];

int j=0;

for(int i:tmparr){

arr2[j]=this.arr[i];

j++;

}

return arr2;

}

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

ArrayBinTree<String> tree = new ArrayBinTree<String>(20, "家庭");

int index=0;

int index2=0;

index=tree.addNode(0, "男", true);

index2=tree.addNode(0, "女", false);

tree.addNode(index, "爷爷他弟", false);

index=tree.addNode(index, "爷爷", true);

 

tree.addNode(index, "爸爸他弟", false);

index=tree.addNode(index, "爸爸", true);

 

tree.addNode(index, "儿子", true);

 

tree.addNode(tree.getNodeIndex("女"), "奶奶他妹", false);

index2=tree.addNode(index2, "奶奶", true);

 

tree.addNode(tree.getNodeIndex("奶奶"), "妈妈他妹", false);

index2=tree.addNode(index2, "妈妈", true);

 

index2=tree.addNode(index2, "女儿", true);

for(int d=0;d<5;d++){

System.out.print("第"+(d+1)+"层:");

Object[] arr2=tree.getNodesByDpth(d+1);

for(Object obj:arr2){

if(obj==null){

continue;

}

System.out.print((String)obj+",");

}

System.out.println();

}

 

}

 

}

 

分享到:
评论

相关推荐

    排序代码实现

    6. **堆排序**:堆排序利用了完全二叉树的特性,将待排序的元素构造成一个大顶堆或小顶堆,然后将堆顶元素与最后一个元素交换,接着对剩下的元素重新调整为堆,如此反复进行。堆排序在最坏、最好和平均情况下的时间...

    java 二叉树详解 + 实现代码

    创建二叉树的过程可以通过数组实现,如`createTree` 方法所示。这个方法首先将输入数组中的所有对象添加到一个列表`datas` 中,然后将第一个元素设置为根节点。接着,遍历列表的前半部分,将每个元素的索引乘以2加1...

    2022年数据结构和算法的Java实现上机.ppt

    本资源摘要信息主要介绍了 Java 实现数据结构和算法的上机实践,包括二叉树的建立和遍历、递归算法的应用等知识点。 数据结构 在计算机科学中,数据结构是指一组数据元素的集合及其在计算机存储和组织方式。常见的...

    华为面试题华为面试题华为面试题华为面试题华为面试题

    3. **数据结构与算法**:数组、链表、栈、队列、堆、树(二叉树、平衡树如AVL、红黑树)、图等是常考的数据结构,而排序(如冒泡、选择、插入、快速、归并)、查找(如二分查找)算法也是必考内容。 4. **集合框架*...

    【蓝桥杯】必备的java数据结构和常用方法

    顺序表的实现静态数组动态数组2.链表的实现二.栈三.队列四.串StringString StringBuffer 和 StringBuilder五.树和二叉树六.哈希表七. 图邻接矩阵邻接表 一.线性表 1.顺序表的实现 静态数组 java只有在为数组分配变量...

    详解堆的javascript实现方法

    在JavaScript中,我们可以利用数组来实现堆。堆分为两种主要类型:大顶堆(Max Heap)和小顶堆(Min Heap)。大顶堆中每个节点的键值都大于或等于其子节点的键值,而小顶堆则相反,每个节点的键值都小于或等于其子...

    JAV:Java算法可视化器API

    熟Java Algorithm Visualizer API 使用此Java API,您应该能够可视化任何一种: -数组-图-二叉树在1.0.0版中,您只能可视化Int数组,之后将会更多作者:GexCode 版本1.0.0

    Java面试宝典2012版

    5、说明生活中遇到的二叉树,用java实现二叉树 66 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序: 71 7、写一个Singleton出来。 75 8、递归算法题1 77 9、...

    Java面试宝典2012新版

    5、说明生活中遇到的二叉树,用java实现二叉树 66 6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序: 71 7、写一个Singleton出来。 75 8、递归算法题1 77 9、递归...

    java经典源码-classic-computer-science-problems-in-java:源代码以及DavidKopec的《Jav

    - **数组**:是最基础的数据结构,用于存储同类型元素的集合,提供快速访问和修改元素的能力。 - **链表**:包含一系列节点,每个节点包含数据和指向下一个节点的引用,允许在任意位置插入和删除元素。 - **栈**...

Global site tag (gtag.js) - Google Analytics