用java和二叉树B-tree实现具有功能的简易数据库(不使用数组或集合)

为了更好的理解二叉树,以二叉树建立一个数据库.不使用数组,集合等具有数据库功能的方法

主要技巧

1. 建立一个内部类Node

2. 取值时.在二叉树循环体外设立一个变数temp,依照特定的键(key)遍历二叉树,当遍历到的节点的key是与寻找的

key相等时,将节点的值赋予temp, 而用作遍历的方法不要有返回值

private void getValue(String key){     
 //依照key取值value
    if(this.leftNode!=null){this.leftNode.getValue(key);}
    if(this.key==key){temp=this.value;}
    if(this.rightNode!=null){this.rightNode.getValue(key);}
}

以下是原始数据和想要实现的统计结果

《用java和二叉树B-tree实现具有功能的简易数据库(不使用数组或集合)》

java代码 (总共有2个类,Btree和TestBtree)

1 .Class Btree (内部类Node) 用于设定各种方法

package btree;
public class Btree{
    Node root;
	static Double temp=null;     //建立一个double变量,用来储存内部类方法计算的(double)结果(平均值,最大值等)             
	int count=0;           //建立一个int变量,用来储存内部类方法计算的(int)结果(节点数)
	boolean flag=false;    //用于测试是否存在
	
    public void append(String key, Double value){             //新增
    	Node node=new Node(key,value);
    	if (root==null){
    		root=node;
    	}else{
    		root.append(key,value);
    	}
    }
    
    public void del(String key){                              //删除
    	this.update(key, null);
    }
    
    public void keyExist(String key){                          //检查key是否存在
    	flag=false;
    	root.keyExist(key);
    	if(flag==false){
    		System.out.println(key+"不存在");
    	}else{
    		System.out.println(key+"存在");
    	}
    }
    
    public void isValid(String key){                          //检查是否为有效数据
    	flag=false;
    	root.isValid(key);
    	if(flag==false){
    		System.out.println(key+"不存在或值为空");
    	}else{
    		System.out.println(key+"是有效数据");
    	}
    }
    
    public void update(String key, Double value){              //更新数据
    	count=0;
    	root.update(key,value);
    	if(count>0){	
    		System.out.println("更新成功");
    	}else{
    		System.out.println("更新失败");
    	}
    }
    
    public void printAll(){                                  //打印全部节点,包括值为null的
    	count=0;
    	if(root==null){
    		System.out.println("Btree内无资料");
    	}else{
    		System.out.println("No"+"\t"+"key"+"\t"+"value");
    		this.root.printAll();
    	}
    }
    
    public void getValue(String key){                        //依照key查询value
    	temp=null;
    	flag=false;
    	root.isValid(key);  //先检查是否存在
    	if(flag==true){
	    	root.getValue(key);
	    	System.out.println("key= "+key+" , "+"value= "+temp);
    	}else{System.out.println(key+"不存在或为空值");}
    }
    	
    
    public int getNum(){                                     //查询节点数
    	count=0;
    	root.getNum();
    	System.out.print("有效节点数为 ");
    	System.out.println(count);
    	return count;
    }
    
    
    public Double getSum(){                                 //查询总和
    	temp=0.0;
    	root.getSum();
    	System.out.print("value的合计值为 ");
    	Double b=(double)((int)(temp*100))/100;
    	System.out.println(b);
    	return b;
    }
    
    public Double getAvg(){                                    //查询平均值
    	temp=0.0;
    	count=0;
    	root.getSum();
    	root.getNum();
    	Double result=(double)((int)((temp/count)*100))/100;
    	System.out.print("value的平均值为 ");
    	System.out.println(result);
    	return result;
    }
    
    public Double getMax(){                                     //查询最大值
    	temp=null;
    	root.getMax();
    	Double result=(double)((int)(temp*100))/100;
      	System.out.print("value的最大值为 ");
    	System.out.println(result);
    	return result;
    }
    
    public Double getMin(){                                       //查询最小值
    	temp=null;
    	root.getMin();
    	Double result=(double)((int)(temp*100))/100;
      	System.out.print("value的最小值为 ");
    	System.out.println(result);
    	return result;
    }
    
    public void getSummary(){                                      //打印综合报表
    	count=0;
    	root.getNum();
    	int num=count;
    	
    	temp=0.0;
    	root.getSum();
    	Double sum=(double)(int)(temp*100)/100;
    	
    	temp=0.0;
    	count=0;
    	root.getSum();
    	root.getNum();
    	double avg=(double)((int)((temp/count)*100))/100;
    	
    	temp=null;
    	root.getMax();
    	Double max=temp;

    	temp=null;
    	root.getMin();
    	Double min=temp;
    	
    	System.out.println("节点数"+"\t"+"合计"+"\t"+"平均"+"\t"+"最大值"+"\t"+"最小值");
    	System.out.println(num+"\t"+sum+"\t"+avg+"\t"+max+"\t"+min);
    }   
    
	//以下是内部类Node
		private class Node{
			    String key;
				Double value;
				Node leftNode;
				Node rightNode;
				
				private Node(String key, double value) {
					this.key = key;
					this.value = value;
				}
	
				private Node(String key) {
					super();
					this.key = key;
				}
                
				private void printAll(){                                    //打印全部
					if(this.leftNode!=null){this.leftNode.printAll();}
					System.out.println((count+1)+"\t"+this.key+"\t"+this.value);count++;
					if(this.rightNode!=null){this.rightNode.printAll();}
				}

				private void getSum(){                                      //查询总和
					if(this.leftNode!=null){this.leftNode.getSum();}
					if(this.value!=null)temp+=this.value;
					if(this.rightNode!=null){this.rightNode.getSum();}
				}
				
				private void getNum(){                                      //查询有效节点数
					if(this.leftNode!=null){this.leftNode.getNum();}
					if(this.value!=null)count++;
					if(this.rightNode!=null){this.rightNode.getNum();}
				}
				
				private void getMax(){                                       //查询最大值
					if(this.leftNode!=null){this.leftNode.getMax();}
					if(temp==null && this.value!=null){temp=this.value;
						}else{
						if(this.value!=null&&temp!=null && this.value>temp){temp=this.value;}
						}
					if(this.rightNode!=null){this.rightNode.getMax();}
				}
				
				private void getMin(){                                       //查询最小值
					if(this.leftNode!=null){this.leftNode.getMin();}
					if(temp==null && this.value!=null){temp=this.value;
					}else{
					if(this.value!=null&&temp!=null && this.value<temp){temp=this.value;}
					}
					if(this.rightNode!=null){this.rightNode.getMin();}
				}
				
				private void append(String key,Double value){                //新增节点
					Node node=new Node(key,value);
					if(key.compareTo(this.key)<0){
						if(leftNode==null){
							leftNode=node;
							}else{
								leftNode.append(key, value);
							}
					}
					if(key.compareTo(this.key)>0){
						if(rightNode==null){
							rightNode=node;
							}else{
								rightNode.append(key, value);
							}
					}
				}
								
				private void getValue(String key){      //依照key取值value
						if(this.leftNode!=null){
					    	this.leftNode.getValue(key);
					    	}
						if(this.key==key){
							temp=this.value;
						}
						if(this.rightNode!=null){
					    	this.rightNode.getValue(key);
					    	}
				}
				
				private void update(String key,Double value){                  //更新节点的Value值
					if(this.leftNode!=null){this.leftNode.update(key,value);}
					if(this.key==key){this.value=value;count++;}					
					if(this.rightNode!=null){this.rightNode.update(key,value);}
				}
				
				private void keyExist(String key){                            //查询key是否存在
					if(this.leftNode!=null){this.leftNode.keyExist(key);}
					if(this.key==key){flag=true;}
					if(this.rightNode!=null){this.rightNode.keyExist(key);}
				}
				
				private void isValid(String key){                              //查询是否是有效数据
					if(this.leftNode!=null){this.leftNode.isValid(key);}
					if(this.key==key && this.value!=null){flag=true;}
					if(this.rightNode!=null){this.rightNode.isValid(key);}
				}
		}//end of Class Node
} //end of Class Btree

2. Class TestBtree  ,用于测试

package btree;

public class TestBtree {

	public static void main(String[] args){
        System.out.println("******创建Btree*********");

		Btree btree=new Btree();              //创建Btree
        btree.printAll();                     //显示btree状态
		System.out.println();

        System.out.println("******开始添加11笔数据******");
        btree.append("200",203.88);           //添加数据
    	btree.append("300",300.33);
    	btree.append("400",400.44);
    	btree.append("500",500.55);
    	btree.append("600",600.66);
    	btree.append("中国",700.77);
    	btree.append("700",-883.91);
    	btree.append("@@",-102.65);
    	btree.append("Hello Btree",-101.55);
    	btree.append("abc",-303.53);
    	btree.append("coffee",99.99);
		System.out.println("添加成功");
		System.out.println();
        btree.getSummary();
		System.out.println();
        btree.printAll();
		System.out.println();

		System.out.println("******测试删除数据的功能,删除coffee******");
        btree.del("coffee");
		System.out.println();

		System.out.println("coffe的值会更新为空值null,保留coffee的Key,有效数据降为10笔**");
		System.out.println();

        btree.getSummary();
		System.out.println();
    
		System.out.println("******测试打印全部Key及Value功能******");
		btree.printAll();                    
		System.out.println();

        System.out.println("******测试查询Key是否存在的功能******");
		btree.keyExist("cake");
		btree.keyExist("abc");
		btree.keyExist("coffee");
		System.out.println();
		
		 System.out.println("******测试数据是否有效的功能******");
		    System.out.println("<<查询不存在的key>>");
            btree.isValid("cake");
    		System.out.println();
		    System.out.println("<<查询空值的key>>");
			btree.isValid("coffee");
			System.out.println();
		    System.out.println("<<查询有效的key>>");
			btree.isValid("abc");
			System.out.println();
		
        System.out.println("******测试查询功能******");
	    System.out.println("<<查询有效的>>");
		btree.getValue("abc");
		System.out.println();
	    System.out.println("<<查询不存在的key>>");
        btree.getValue("cake");
		System.out.println();
	    System.out.println("<<查询空值的key>>");
        btree.getValue("coffee");
		System.out.println();

		
		System.out.println("******测试查询有效节点数功能******");
		btree.getNum();
		System.out.println();

        System.out.println("******测试查询合计值功能******");
		btree.getSum();
		System.out.println();

        System.out.println("******测试查询平均值功能******");
		btree.getAvg();
		System.out.println();

        System.out.println("******测试查询最大值功能******");
		btree.getMax();
		System.out.println();

        System.out.println("******测试查询最小值功能******");
		btree.getMin();
		System.out.println();

        System.out.println("******测试打印汇总表功能******");
		btree.getSummary();
		System.out.println();

        System.out.println("******测试更新功能******");
        System.out.println("将300的值改为null,abc的值改为null,coffee的值改为-999.0,中国的值改为800.0");
        btree.update("300",null);
        btree.update("abc",null);
        btree.update("coffee",-999.0);
		btree.update("中国",800.0);
		
		System.out.println();
		btree.printAll();
		System.out.println();
        btree.getSummary();
		System.out.println();
		
        System.out.println("******测试结束******");

     }
}

测试结果如下:

******创建Btree*********
Btree内无资料

******开始添加11笔数据******
添加成功

节点数 合计 平均 最大值 最小值
11 1414.98 128.63 700.77 -883.91

No key value
1 200 203.88
2 300 300.33
3 400 400.44
4 500 500.55
5 600 600.66
6 700 -883.91
7 @@ -102.65
8 Hello Btree -101.55
9 abc -303.53
10 coffee 99.99
11 中国 700.77

******测试删除数据的功能,删除coffee******
更新成功

coffe的值会更新为空值null,保留coffee的Key,有效数据降为10笔**

节点数 合计 平均 最大值 最小值
10 1314.99 131.49 700.77 -883.91

******测试打印全部Key及Value功能******
No key value
1 200 203.88
2 300 300.33
3 400 400.44
4 500 500.55
5 600 600.66
6 700 -883.91
7 @@ -102.65
8 Hello Btree -101.55
9 abc -303.53
10 coffee null
11 中国 700.77

******测试查询Key是否存在的功能******
cake不存在
abc存在
coffee存在

******测试数据是否有效的功能******
<<查询不存在的key>>
cake不存在或值为空

<<查询空值的key>>
coffee不存在或值为空

<<查询有效的key>>
abc是有效数据

******测试查询功能******
<<查询有效的>>
key= abc , value= -303.53

<<查询不存在的key>>
cake不存在或为空值

<<查询空值的key>>
coffee不存在或为空值

******测试查询有效节点数功能******
有效节点数为 10

******测试查询合计值功能******
value的合计值为 1314.99

******测试查询平均值功能******
value的平均值为 131.49

******测试查询最大值功能******
value的最大值为 700.77

******测试查询最小值功能******
value的最小值为 -883.91

******测试打印汇总表功能******
节点数 合计 平均 最大值 最小值
10 1314.99 131.49 700.77 -883.91

******测试更新功能******
将300的值改为null,abc的值改为null,coffee的值改为-999.0,中国的值改为800.0
更新成功
更新成功
更新成功
更新成功

No key value
1 200 203.88
2 300 null
3 400 400.44
4 500 500.55
5 600 600.66
6 700 -883.91
7 @@ -102.65
8 Hello Btree -101.55
9 abc null
10 coffee -999.0
11 中国 800.0

节点数 合计 平均 最大值 最小值
9 418.41 46.49 800.0 -999.0

******测试结束******

    原文作者:B树
    原文地址: https://blog.csdn.net/howard789/article/details/73649670
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞