package com.arithmetic;
//二叉查找树(Binary Search Tree),或者是一棵空树,或者是具有下列性质的二叉树:
//若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
//若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
//它的左、右子树也分别为二叉排序树。
public class Test_wzs009 {
public static int Max = 10;
public static int[] Data = { 15, 2, 13, 6, 17, 25, 37, 7, 3, 18 }; // 数据数组
public static int Counter = 1;
public static void main(String args[]) {
int i; // 循环计数变量
BNTreeArray BNTree = new BNTreeArray(); // 声明二叉树数组
BNTree.TreeData[0] = Data[0];
for (i = 1; i < Max; i++)
BNTree.Create(Data[i]); // 建立二叉查找树
int KeyValue = 25;
// 调用二叉查找法
if (BNTree.BinarySearch(KeyValue) > 0)
// 输出查找次数
System.out.println("Search Time = " + BNTree.BinarySearch(KeyValue));
else
// 输出没有找到数据
System.out.println("No Found!!");
}
}
class BNTreeArray {
public static int MaxSize = 20;
public static int[] TreeData = new int[MaxSize];
public static int[] RightNode = new int[MaxSize];
public static int[] LeftNode = new int[MaxSize];
public BNTreeArray() {
int i; // 循环计数变量
for (i = 0; i < MaxSize; i++) {
TreeData[i] = 0;
RightNode[i] = -1;
LeftNode[i] = -1;
}
}
// ----------------------------------------------------
// 建立二叉树
// ----------------------------------------------------
public void Create(int Data) {
int i; // 循环计数变量
int Level = 0; // 树的阶层数
int Position = 0;
for (i = 0; TreeData[i] != 0; i++)
;
TreeData[i] = Data;
while (true) // 寻找节点位置
{
// 判断是左子树或是右子树
if (Data > TreeData[Level]) {
// 右树是否有下一阶层
if (RightNode[Level] != -1)
Level = RightNode[Level];
else {
Position = -1; // 设定为右树
break;
}
} else {
// 左树是否有下一阶层
if (LeftNode[Level] != -1)
Level = LeftNode[Level];
else {
Position = 1; // 设定为左树
break;
}
}
}
if (Position == 1) // 建立节点的左右连结
LeftNode[Level] = i; // 连结左子树
else
RightNode[Level] = i; // 连结右子树
}
// ---------------------------------------------------------
// 二叉查找法
// ---------------------------------------------------------
public static int BinarySearch(int KeyValue) {
int Pointer; // 现在的节点位置
int Counter; // 查找次数
Pointer = 0;
Counter = 0;
while (Pointer != -1) {
Counter++;
// 找到了欲寻找之节点
if (TreeData[Pointer] == KeyValue)
return Counter; // 传回查找次数
else if (TreeData[Pointer] > KeyValue)
Pointer = LeftNode[Pointer]; // 往左子树找
else
Pointer = RightNode[Pointer];// 往右子树找
}
return 0; // 该节点不在此二叉树中
}
}
java排序算法_009二叉查找树
最新推荐文章于 2024-10-31 15:56:11 发布