/**
* 说明生活中遇到的二叉树,用 java 实现二叉树 。
这是组合设计模式。
我有很多个(假设 10 万个)数据要保存起来,以后还需要从保存的这些数据中检索是否存在
某个数据, (我想说出二叉树的好处, 该怎么说呢?那就是说别人的缺点) , 假如存在数组中,
那么,碰巧要找的数字位于 99999那个地方,那查找的速度将很慢,因为要从第 1 个依次往 67
后取,取出来后进行比较。平衡二叉树(构建平衡二叉树需要先排序,我们这里就不作考虑
了)可以很好地解决这个问题,但二叉树的遍历(前序,中序,后序)效率要比数组低很多,
* store(int value)可以选择二叉树中是否可以存在相同的值
*/
package test;
//Node,准确的说,是树(包括子树)的根节点
public class Node{
public int value;
public Node left;
public Node right;
//这种存储方式,是:往已经存在的节点的左右子节点上寻找插入点,而不是考虑作为已经存在的节点的父节点,会造成二叉树的不平衡
public void store(int value){
if(value<this.value){
if(left==null){
left = new Node();
left.value=value;
}else{
left.store(value);
}
}else if(value>this.value){
if(right==null){
right = new Node();
right.value=value;
}else{
right.store(value);
}
}//已经存在的值,不插入
}
//先序遍历
public void preList(){
System.out.print(this.value+",");
if(left!=null)left.preList();
if(right!=null)right.preList();
}
//中序遍历
public void middleList(){
if(left!=null)left.middleList();
System.out.print(this.value+",");
if(right!=null)right.middleList();
}
public void afterList(){
if(left!=null)left.afterList();
if(right!=null)right.afterList();
System.out.print(this.value+",");
}
public static void main(String [] args){
int[] data = new int[20];
for(int i=0; i<data.length; i++){
data[i] = (int)(Math.random()*100)+1;//0+1<<x*100+1<<1*100+1
System.out.print(data[i]+",");
}
System.out.println();
Node root = new Node();
root.value = data[0];
for(int i=1; i<data.length; i++){
root.store(data[i]);
}
root.preList();
System.out.println();
root.middleList();
System.out.println();
root.afterList();
}
}
首先说明,该二叉树建的并不好,存储节点时,只能向空节点填充,而不同调整树的结构。
我曾经写过一个C++的二叉树,同样的思路,当时觉得这种思路弱爆了,等到看见这篇程序,我恍然大悟:傻傻的路上不会孤单。