69.Java实现一个搜索二叉树

编程题目:

69.Java实现一个搜索二叉树。

示例代码:

package program.calculation.exercise69;

/**
 * 二叉树(BinaryTree):
 * 在计算机科学中,二叉树是每个结点最多有两个子树的树结构。
 * 通常子树被称作左子树(left subtree)和右子树(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。
 * 二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。
 * 二叉树的第i层至多有2^(i-1)个结点;深度为k的二叉树至多有2^k-1个结点;
 * 对任何一棵二叉树T,如果其终端结点数为n_0,度为2的结点数为n_2,则n_0=n_2+1。
 * 一棵深度为k,且有2^k-1个节点的二叉树,称为满二叉树。这种树的特点是每一层上的节点数都是最大节点数。
 * 而在一棵二叉树中,除最后一层外,若其余层都是满的,并且最后一层或者是满的,或者是在右边缺少连续若干节点,则此二叉树为完全二叉树。
 * 具有n个节点的完全二叉树的深度为log2(n+1)。深度为k的完全二叉树,至少有2^(k-1)个节点,至多有2^k-1个节点。
 *
 * 树的遍历顺序大体分为三种:前序遍历(先根遍历、先序遍历),中序遍历(中根遍历),后序遍历(后根遍历)。如图所示二叉树:
 * 			A
 * 		B		C
 *    D	  E   F
 * (1)前序遍历:前序遍历可以记为根左右,若二叉树为空,则结束返回。
 *  前序遍历的规则:(1)访问根节点(2)前序遍历左子树(3)前序遍历右子树这里需要
 *  注意:在完成第2,3步的时候,也是要按照前序遍历二叉树的规则完成。前序遍历的输出结果:ABDECF
 * (2)中序遍历:中序遍历可以记为左根右,也就是说在二叉树的遍历过程中,首先要遍历二叉树的左子树,接着遍历根节点,最后遍历右子树。
 *  同样,在二叉树为空的时候,结束返回。
 *  中序遍历的规则:(1)中序遍历左子树(2)访问根节点(3)中序遍历右子树
 *  注意:在完成第1,3步的时候,要按照中序遍历的规则来完成。中序遍历的输出结果:DBEAFC
 * (3)后序遍历:后序遍历可以记为左右根,也就是说在二叉树的遍历过程中,首先按照后序遍历的规则遍历左子树,接着按照后序遍历的规则遍历右子树,
 *  最后访问根节点。在二叉树为空的时候,结束返回。
 *  后序遍历二叉树的规则:(1)后序遍历左子树(2)后序遍历右子树(3)访问根节点
 *  注意:在完成1,2步的时候,依然要按照后序遍历的规则来完成。后序遍历的输出顺序:DEBFCA
 */

/**
 * 69.Java实现一个搜索二叉树。
 */

public class BinaryTree {
	
	public int value;//定义节点值
	public BinaryTree left;//定义左叶子节点
	public BinaryTree right;//定义右叶子节点
	
	public static void main(String [] args){
		
		int [] data = {2,5,1,4,3};
		System.out.println("遍历数组:");
		for(int i=0;i<data.length;i++){
			System.out.print(data[i] + " ");
		}
		
		BinaryTree root = new BinaryTree();//定义根节点
		root.value = data[0];
		for(int i=1;i<data.length;i++){
			root.store(data[i]);
		}
		
		System.out.println();
		System.out.println("查找节点:");
		root.find(data[3]);
		
		System.out.println();
		System.out.println("前序遍历:");
		root.beforeList();
		
		System.out.println();
		System.out.println("中序遍历:");
		root.middleList();
		
		System.out.println();
		System.out.println("后序遍历:");
		root.afterList();
	}
	
	//存储节点(二叉查找树:左结点小于根结点,右结点大于根结点)
	//这种存储方式是往已经存在的节点的左右子节点上寻找插入点,而不是考虑作为已经存在的节点的父节点,会造成二叉树的不平衡
	public void store(int value){
		if(value < this.value){
			if(left == null){
				left = new BinaryTree();
				left.value = value;
			}else{
				left.store(value);
			}
		}else if(value > this.value){
			if(right == null){
				right = new BinaryTree();
				right.value = value;
			}else{
				right.store(value);
			}			
		}
	}
	
	//查找节点
	public boolean find(int value){	
		System.out.print(this.value+" ");
		if(value == this.value){
			return true;
		}else if(value > this.value){
			if(right == null){
				return false;
			} 
			return right.find(value);
		}else{
			if(left == null){
				return false;
			} 
			return left.find(value);
		}

	}
	
	//前序遍历
	public void beforeList(){
		System.out.print(this.value + " ");
		if(left != null){
			left.beforeList();
		} 
		if(right != null){
			right.beforeList();
		} 
	}
	
	//中序遍历
	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 + " ");		
	}	
	
}

结果显示:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值