二叉排序树是的数据结构是一个有序的二叉树,在建立二叉排序树的时候便进行了有序化。其中要插入的元素大于当前节点,则向右,否则向左,直到当前节点的左孩子或者右孩子为空,则插入该节点。。
建立完二叉排序树之后,对整个二叉树进行中序遍历,便得到有序的数列。
public class BinaryTreeSort {
BinaryNode root;//二叉排序树的根节点
public BinaryTreeSort()//二叉排序树的初始化
{
root=null;
}
void insert(int elem)//向二叉排序树里面插入元素,同时进行排序
{
BinaryNode node=new BinaryNode(elem);//新建节点
int i=-1;
if(root==null)//第一次插入的情况
{
root=node;
}
else
{
BinaryNode p=root;
while(p!=null)//插入节点
{
if(compare(p.getData(),elem)==1)//当前节点大于所要插入的元素,则往左
{
if(p.lchild!=null)//左孩子不为空
p=p.lchild;
else//否则跳出当前循环,
{
i=1;
break;
}
}
else //否则往右
{
if(p.rchild!=null)//右孩子不为空
p=p.rchild;
else//否则跳出当前循环,
{
i=0;
break;
}
}
}
if(i==1)//在右孩子插入当前节点
p.lchild=node;
else if(i==0)//在左孩子插入当前节点
p.rchild=node;
}
}
boolean find(int data)//查找元素
{
BinaryNode p=root;
while(p!=null)
{
int i=compare(p.getData(),data);
if(i==0)//如果i==0,则找到
{
System.out.println("find it");
return true;
}
else if(i==1)//如果当前节点大于寻找的节点,则向右
p=p.rchild;
else//否则向左
p=p.lchild;
}
System.out.println("Not Find");//否则没有找到
return false;
}
void InorderTravel()
{
travel(root);
}
void travel(BinaryNode T)//中序遍历二叉树,得到有序的数
{
if(T!=null)
{
travel(T.lchild);
System.out.println(T.getData()+" ");
travel(T.rchild);
}
}
public int compare(int a,int b)
{
if(a>b)
return 1;
else if(a==b)
return 0;
else
return - 1;
}
public class BinaryNode//定义二叉树节点的数据结构
{
BinaryNode lchild;//左孩子
BinaryNode rchild;//右孩子
int data;//数据域
public BinaryNode(int dat)
{
data=dat;
lchild=null;
rchild=null;
}
public BinaryNode getLchild() {
return lchild;
}
public void setLchild(BinaryNode lchild) {
this.lchild = lchild;
}
public BinaryNode getRchild() {
return rchild;
}
public void setRchild(BinaryNode rchild) {
this.rchild = rchild;
}
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
}
public static void main(String[] args) {
BinaryTreeSort tree=new BinaryTreeSort();
tree.insert(4);
tree.insert(5);
tree.insert(1);
tree.insert(0);
tree.insert(8);
tree.insert(10);
tree.insert(3);
tree.InorderTravel();
tree.find(10);
}
}