Java实现简单二叉树

B

       即二叉搜索树:

       1.所有非叶子结点至多拥有两个儿子(LeftRight);

       2.所有结点存储一个关键字;

       3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树;

       如:

       

       B树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;

否则,如果查询关键字比结点关键字小,就进入左儿子;如果比结点关键字大,就进入

右儿子;如果左儿子或右儿子的指针为空,则报告找不到相应的关键字;

       如果B树的所有非叶子结点的左右子树的结点数目均保持差不多(平衡),那么B

的搜索性能逼近二分查找;但它比连续内存空间的二分查找的优点是,改变B树结构

(插入与删除结点)不需要移动大段的内存数据,甚至通常是常数开销;

       如:

      

   但B树在经过多次插入与删除后,有可能导致不同的结构:

   右边也是一个B树,但它的搜索性能已经是线性的了;同样的关键字集合有可能导致不同的

树结构索引;所以,使用B树还要考虑尽可能让B树保持左图的结构,和避免右图的结构,也就

是所谓的“平衡”问题;      

       实际使用的B树都是在原B树的基础上加上平衡算法,即“平衡二叉树”;如何保持B

结点分布均匀的平衡算法是平衡二叉树的关键;平衡算法是一种在B树中插入和删除结点的

策略;

public class NodeTree {
	 int data; //根节点数据
	 NodeTree left; //左子树
	  NodeTree right; //右子树
	public NodeTree() {
		super();
	}
	public NodeTree(int data) { //实例化二叉树
		super();
		this.data = data;
		left=null;
		right=null;
	}
	 public void insert(NodeTree root,int data){
		 if(data>root.data){ //如果插入的节点大于跟节点
			 if(root.right==null){			//如果右子树为空,就插入,如果不为空就再创建一个节点											 				
			 root.right=new NodeTree(data); //就把插入的节点放在右边
			 }else{
				 this.insert(root.right, data);
			 }
		 }else{  //如果插入的节点小于根节点
			 if(root.left==null){ //如果左子树为空,就插入,如果不为空就再创建一个节点			
				 root.left=new NodeTree(data); //就把插入的节点放在左边边
			 }else{
				 this.insert(root.left, data);
			 }
		 }
	 }
}


public class NodeQuery {
	public static void preOrder(NodeTree root) { // 先根遍历
		if (root != null) {
			System.out.print(root.data + "-");
			preOrder(root.left);
			preOrder(root.right);
		}
	}

	public static void inOrder(NodeTree root) { // 中根遍历

		if (root != null) {
			inOrder(root.left);
			System.out.print(root.data + "--");
			inOrder(root.right);
		}
	}

	public static void postOrder(NodeTree root) { // 后根遍历

		if (root != null) {
			postOrder(root.left);
			postOrder(root.right);
			System.out.print(root.data + "---");
		}
	}
	public static void main(String[] args) {
		 int[] array = {35,17,39,9,28,65,56,87};
		  NodeTree root = new NodeTree(array[0]);   //创建二叉树
		  for(int i=1;i<array.length;i++){
		   root.insert(root, array[i]);       //向二叉树中插入数据
		  }
		  System.out.println("先根遍历:");
		  preOrder(root);
		/*  System.out.println();
		  System.out.println("中根遍历:");
		  inOrder(root);
		  System.out.println();
		  System.out.println("后根遍历:");
		  postOrder(root);*/
	}
}

上面这个树的实现,应该是最经典最简单的了吧;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值