二叉树 java泛型_数据结构与算法——二叉搜索树 (java泛型类)

本文介绍了一个使用Java泛型实现的二叉搜索树(BSTree)类,包括创建、插入、打印和遍历等操作。通过`Insert`方法实现了节点的插入,`Height`方法计算树的高度,`PrintTree`方法采用层次遍历进行树的打印,`Delete`方法实现了删除节点功能。此外,还提供了查找最小值节点的方法。
摘要由CSDN通过智能技术生成

public class BSTree>{private BinarySearchTreeNode head;//根节点

//获得根NTreeNodegetHead(){returnhead;

}//新建BSTree树

public NTreeNodeCreate(T[] data ){

NTreeNode root = null;for(T temp : data){

root=Insert(root, temp);

}

head= (BinarySearchTreeNode)root;returnroot;

}//10/// \//8 12//假设每个数据占2个// public void PrintTree(NTreeNoderoot){

if(root == null)return;

BinarySearchTreeNode symbol = new BinarySearchTreeNode<>();//标识节点

int level = Height(root) - 1 ;//节点所在的层,从根为0层开始//满二叉树上,n层的节点数为2^n

int leafNum = (int)Math.pow(2, level);//满二叉树叶子数(最低层)

LLQueue> Q = new LLQueue<>();//新建二叉搜索树节点队列

LLNode> temp;//注意泛型

Q.enQueue(root);//根入队列//逐层

for(int i=0; i <= level; i++){int num = (int)Math.pow(2, i);//每一层最多为2^n

int length = Math.round(leafNum/(num +1));//int length = (leafNum -(num + 1))/(num + 1);//System.out.println(num);

for(int j = 0; j < num; j++){ //每一层最多为2^n

temp = Q.deQueue();//取队头//打印 for(int k = 0; k < length; k++){

System.out.print("//");

}//队列中的节点为symbol,打印占位符// if(symbol.equals(temp.data)){ //temp.data == symbol

System.out.print("//");

}else {//否则打印节点信息

T info =temp.data.getData();

System.out.print(info);//打印节点值

}if(temp.data.getLeft() != null){

Q.enQueue(temp.data.getLeft());//左儿子入队列

}else{

Q.enQueue(symbol);//压入一个空标志

}if(temp.data.getRight() != null){

Q.enQueue(temp.data.getRight());//右儿子入队列

}else{

Q.enQueue(symbol);

}

}//再打印些占位符/

for(int k = 0; k < length; k++){

System.out.print("//");

}

System.out.println();

}

}//逐层打印

public void LevelPrint(BinarySearchTreeNoderoot){if(root == null) return;else{

LLQueue> Q = new LLQueue<>();

LLNode>temp;

Q.enQueue(root);while(!Q.IsEmpty()){

temp= Q.deQueue();//取队头的值//Do something

System.out.print(temp.data.getData()+" ");//打印

if(temp.data.getLeft() != null){

Q.enQueue(temp.data.getLeft());//左儿子入队列

}if(temp.data.getRight() != null){

Q.enQueue(temp.data.getRight());//右儿子入队列

}

}

}

}//先根遍历

public void PreOrder(BinarySearchTreeNoderoot){if(root != null){//Do something;

System.out.print(root.getData()+" ");

PreOrder(root.getLeft());

PreOrder(root.getRight());

}

}//中根遍历

public void InOrder(BinarySearchTreeNoderoot){if(root != null){

InOrder(root.getLeft());

System.out.print(root.getData()+" ");//Do something;

InOrder(root.getRight());

}

}//后根遍历

public void PostOrder(BinarySearchTreeNoderoot){if(root != null){

PostOrder(root.getLeft());

PostOrder(root.getRight());

System.out.print(root.getData()+" ");//Do something;

}

}//a大于b,返回1;a小于b,返回-1;a等于b,返回0;

private intCompare(T a, T b){/*compareTo()

如果指定的数与参数相等返回0。

如果指定的数小于参数返回 -1。

如果指定的数大于参数返回 1。*/

returna.compareTo(b);

}//插入

public NTreeNode Insert(NTreeNoderoot, T data){

if(root == null){

root= new BinarySearchTreeNode<>();

root.setData(data);

root.setLeft(null);

root.setRight(null);

}else{if(data.compareTo(root.getData()) >= 1){ //data > root.getData();

root.setRight(Insert(root.getRight(), data));

}else if(data.compareTo(root.getData()) <= -1){ //data > root.getData();

root.setLeft(Insert(root.getLeft(), data));

}else{ //找到相同的点什么也不做;

}

}returnroot;

}//得到二叉搜索树高度

public int Height(NTreeNoderoot){if(root == null){return 0;

}return ( Height(root.getLeft()) > Height(root.getRight()) ? Height(root.getLeft()) : Height(root.getRight()) ) + 1;

}//最小值节点,最左的叶子

public NTreeNode FindMin(NTreeNoderoot){if(root == null){ //判断第一次进入的根

return null;

}if(root.getLeft() == null){returnroot;

}else{returnFindMin(root.getLeft());

}

}//删除节点

public NTreeNode Delete(NTreeNoderoot, T data){BinarySearchTreeNode rightMin;

if(root == null)

System.out.println("Element not there in tree!");//没有找到data的节点

else if (Compare(data, root.getData()) >= 1) {

root.setRight(Delete(root.getRight(), data));

}else if(Compare(data, root.getData()) <= -1){//root.setLeft(Delete(root.getLeft(), data));

BinarySearchTreeNode temp = (BinarySearchTreeNode)Delete(root.getLeft(), data);

root.setLeft(temp);

}else{//找到节点

if (root.getLeft() != null && root.getRight() != null) {

rightMin= (BinarySearchTreeNode)FindMin(root.getRight());//找出右子树最小值

root.setData(rightMin.getData());//右子树最小值替换当前节点值

root.setRight(Delete(root.getRight(), rightMin.getData()));

}else if(root.getLeft() == null && root.getRight() == null){ //不填这支就错误

root = null;

}else{//单支或叶子节点[这样可以令左右孩子都为null]

if(root.getLeft() == null){

root=root.getRight();

}if(root.getRight() == null){

root=root.getLeft();

}

}

}returnroot;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值