java实现B树(二叉树)插入,删除

B树(二叉搜索树)定义:
1)、每个非叶子节点至多有两个子节点。
2)、每个节点都存储关键字值。
3)、其左子节点的关键字值小于该节点,且右子节点的关键字值大于或等于该节点。

/** 
* 节点类 
*/ 
class Node{ 
public int key; 
public int data; 
public Node leftChild; 
public Node rightChild; 

public Node(int key, int data){ 
this.key = key; 
this.data = data; 
this.leftChild = null; 
this.rightChild = null; 
} 

public void display(){ 
System.out.println("key: " + key + ", data: " + data); 
} 
} 

/** 
* B树类 
*/ 
class Tree{ 
public Node root; 

public void insert(int key, int data){ 
Node newNode = new Node(key, data); 

if (root == null){ 
root = newNode; 
}else{ 
Node current = root; 
Node parent = null; 
while (true){ 
parent = current; 
if (key < current.key){ 
current = current.leftChild; 
if (current == null){ 
parent.leftChild = newNode; 
return; 
} 
}else{ 
current = current.rightChild; 
if (current == null){ 
parent.rightChild = newNode; 
return; 
} 
} 
} 
} 
} 

/** 只实现有一个节点的删除 */ 
public boolean delete(int key){ 
Node current = root; 
Node parent = null; 
boolean isLeftChild = false; 

while (current.key != key){ 
parent = current; 
if (key < current.key){ 
current = current.leftChild; 
isLeftChild = true; 
}else{ 
current = current.rightChild; 
isLeftChild = false; 
} 
} 

if (current == null){ 
return false; 
} 

/** 无子节点 */ 
if (current.leftChild == null && current.rightChild == null){ 
if (current == root){ 
root = null; 
}else if (isLeftChild){ 
parent.leftChild = null; 
}else{ 
parent.rightChild = null; 
} 
} 
/** 仅有右节点 */ 
else if ((current.leftChild == null && current.rightChild != null)){ 
if (current == root){ 
root = current.rightChild; 
}else if (isLeftChild){ 
parent.leftChild = current.rightChild; 
}else{ 
parent.rightChild = current.rightChild; 
} 
}else if ((current.leftChild != null && current.rightChild == null)){ 
if (current == root){ 
root = null; 
}else if (isLeftChild){ 
parent.leftChild = current.leftChild; 
}else{ 
parent.rightChild = current.leftChild; 
} 
} 
return true; 
} 

public Node find(int key){ 
Node current = root; 
while (current != null){ 
if (current.key == key){ 
break; 
}else if (key < current.key){ 
current = current.leftChild; 
}else{ 
current = current.rightChild; 
} 
} 

return current; 
} 

/** 中序 */ 
public void inOrder(Node localNode){ 
if (localNode  != null){ 
inOrder(localNode.leftChild); 
System.out.println("key: " + localNode.key + ", data: " + localNode.data); 
inOrder(localNode.rightChild); 
} 

} 

} 

public class BTree { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
// TODO Auto-generated method stub 
Tree newTree = new Tree(); 
newTree.insert(5, 5); 
newTree.insert(1, 1); 
newTree.insert(2, 2); 
newTree.insert(8, 8); 
newTree.insert(9, 9); 
newTree.insert(7, 7); 

newTree.delete(1); 
newTree.inOrder(newTree.root); 
} 

} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值