用java和二叉树B-tree实现具有<增,删,改,查,统计>功能的简易数据库(不使用数组或集合)

本文介绍了一种利用二叉树结构实现的简单数据库系统。该系统支持增删改查等功能,并能够进行节点数量、总和、平均值等多种统计运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

主要技巧

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代码 (总共有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

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



### 结构化数据的定义与特点 在计算机科学领域,结构化数据是指按照预定义模型格式组织起来的数据集合。这种数据通常遵循特定的模式规则,使得其易于被计算机系统解析、存储以及检索。结构化数据的一个显著特征是可以轻松映射到数据库表中的行列关系[^1]。 #### 定义 结构化数据通过明确的对象属性及其关联方式来描述复杂实体的信息。例如,在学生管理系统中,可以利用结构体(struct)将学生的姓名、年龄、成绩等多个字段组合成单一的整体单元进行管理。这种方式仅提高了代码的可读性逻辑清晰度,还强了系统的扩展能力。 #### 特点 - **易操作性**: 使用结构体能够简化大量独立变量的操作流程,减少因频繁传递多个参数而带来的便。 - **功能特性**: 提升了程序设计上的灵活性,允许开发者更方便地调整对象内部组成而影响外部接口。 - **优化资源利用率**: 对于某些场景下需要同时处理多种同类型但相互联系紧密的数据项而言尤为重要[^2]。 ### 示例分析 以下是几个关于如何应用结构化方法解决实际问题的例子: #### 学生信息记录 当面对众多的学生资料时,如果采用任何结构性手段,则每新一位学员都需要单独声明若干个新变量;反之借助C++/Java等编程语言支持下的`class` 者 `struct`, 就能一次性完成全部必要字段设定: ```cpp // C++ Example of Structured Data Representation - Student Record System #include <iostream> using namespace std; struct Student { string name; int age; double gpa; // Grade Point Average }; int main(){ struct Student s1={"Alice", 20, 3.8}; cout << "Name:" <<s1.name<< "\nAge:"<<s1.age<<"\nGPA:"<<s1.gpa<<endl; } ``` 此段代码展示了创建了一个简单的student record system 的过程,其中包含了三个主要组成部分:名字(name),年纪(age) 平均分(gpa). #### 非结构化转结构化的案例——文档索引构建 对于大量的非结构化文本文件来说,要实现快速找某个关键词所在位置几乎是可能的任务除非先把这些原始材料加工成为某种形式上更加规整的新版本即所谓的“向量空间”。具体做法如下所示: 假设有一组文章A={a₁,a₂,...an} , 我们可以通过TF-IDF算法者其他自然语言处理技术提取出它们各自的特征词集V={v₁,v₂,…vm}, 进一步形成稀疏矩阵M[n][m], 此处每一行代表一篇文章对应的所有维度权重值。最终达到目的就是把原来杂乱无章的文字串变换成适合机器学习框架使用的数值型数组. #### 二叉树序列化&反序列化实例 考虑一棵普通的二叉搜索(Binary Search Tree), 如果想要将其保存至硬盘驱动器以便日后加载回来继续使用的话就需要经历两个阶段的工作—先是把它变成一连串字符组成的表达式也就是所谓"serialization"; 接着再依据这个字符串重建原来的tree structure 称之为"deserialization". 下面给出Python版简易示范代码片段: ```python # Python Code Demonstrating Serialization and Deserialization Process on Binary Trees. import json class Node(object): def __init__(self,value,left=None,right=None): self.value=value self.left=left self.right=right def serialize(root_node): """Convert binary tree into JSON format.""" if root_node is None: return 'null' serialized_tree={ 'value':root_node.value, 'left' :serialize(root_node.left), 'right':serialize(root_node.right)} return json.dumps(serialized_tree) def deserialize(s): """Rebuild the original binary tree from its serialized form""" obj=json.loads(s) if obj=='null': return None node=Node(obj['value']) node.left=deserialize(json.dumps(obj.get('left','null'))) node.right=deserialize(json.dumps(obj.get('right','null'))) return node if __name__=="__main__": n7=Node(7,None,None);n6=Node(6,None,n7); n5=Node(5,None,n6);n4=Node(4,n5,None); n3=Node(3,None,n4);n2=Node(2,n3,None); n1=Node(1,n2,None); print ("Original Preorder Traversal:",end=" ") preOrder(n1) serialized_result=serialize(n1) print("\nSerialized Result:\n%s"%serialized_result) restored_root=deserialize(serialized_result) print ("\nRestored Preorder Traversal After Deserializing:") preOrder(restored_root) ``` 上述脚本实现了对给定BST节点执行递归遍历并生成相应JSON编码的过程,同时也提供了逆运算的功能以验证整个机制的有效性[^3].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值