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();

}

 

}

 

}

 

Java 中,当你需要对包含对象的数组进行扩容时,主要涉及到的是动态数组(ArrayList 或其他集合类如LinkedList)。直接操作原始数组扩容并不是常见的做法,因为原始数组在创建时已经固定了大小,并不适合频繁地调整大小。对于包含对象的数组来说,推荐使用像 ArrayList 这样的动态数组。 下面是如何使用 `ArrayList` 扩容的例子: ```java import java.util.ArrayList; public class Main { public static void main(String[] args) { // 初始化一个 ArrayList,这里传入的容量为 5 ArrayList<String> list = new ArrayList<>(5); // 添加一些元素到列表中 list.add("Apple"); list.add("Banana"); list.add("Cherry"); System.out.println("初始列表内容:" + list); // 检查是否需要扩容 if (list.size() < list.capacity()) { // 自动扩容,当添加元素超过当前容量时,ArrayList 会自动增加容量至原始容量的 1.5 倍加上一些常量值, // 直到满足所需容量为止。 for (int i = list.size(); i <= "Orange".length(); i++) { list.add(String.valueOf(i)); } } System.out.println("扩展示例后的列表内容:" + list); } } ``` 在这个例子中,我们首先初始化了一个 `ArrayList` 并添加了一些字符串元素。然后检查列表的容量是否不足以容纳更多的元素。如果需要,通过循环继续添加元素直到达到所需的长度。 **注意事项**: 1. **自动扩容**:`ArrayList` 提供了自动扩容的功能。它会在尝试向已满的数组追加元素时自动增大容量,这通常基于原容量乘以某个系数(默认是1.5),并加上一定的常数值。 2. **手动管理**:如果你确定数组大小变化范围有限制,你可以考虑使用 `ensureCapacity()` 方法来提前设置更大的容量,避免多次扩容导致性能下降。 3. **内存使用**:扩容虽然方便,但也可能导致额外的内存开销。在处理大量数据时需谨慎,特别是在空间效率非常关键的应用场景下。 --- -
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值