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