编程题目:
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 + " ");
}
}