二叉查找树或者是棵空树,或者满足下面的特性:
(1)如果它的左子树不为空,那么它的左子树上的任意节点的值都小于根节点的值。
(2)如果它的右子树不为空,那么它的右子树上任意节点的值都大于根节点的值。
(3)同样,它的左子树和右子树也都是二叉查找树。
二叉查找树的代码实现如下:
package com.threetop.www;
/**
* 二叉查找树的实现
* @author wjgs
*
*/
public class BinarySearchTree
{
private BinaryTreeNode root;
//构造函数实现初始化
public BinarySearchTree(BinaryTreeNode root)
{
this.root=root;
}
//**************************************************************
/**
* 二叉查找树的查找实现
* @param data
* @return
*/
public BinaryTreeNode search(int data)
{
return search(root,data);
}
/**
* 递归二叉查找树
* @param node
* @param data
* @return
*/
private BinaryTreeNode search(BinaryTreeNode node ,int data)
{
if(node==null)
{
return null;
}
else if(node.getData()==data)
{
return node;
}else if(data>node.getData())
{
//右子树查找
return search(node.getRightChild(),data);
}else
{
//左子树查找
return search(node.getLeftChild(),data);
}
}
//**************************************************************
//***************************二叉查找树的插入操作***********************************
public void insert(int data)
{
if(root==null)
{
root=new BinaryTreeNode();
root.setData(data);
}
else
{
searchAndInsert(null,root,data);
}
}
/**
*
* 递归二叉查找树(如果没有找到,则新建一个最终位置的节点)
* @param parent
* @param node
* @param data
*/
private BinaryTreeNode searchAndInsert(BinaryTreeNode parent, BinaryTreeNode node, int data) {
if(node==null)
{
node =new BinaryTreeNode();
node.setData(data);
if(data>parent.getData())
{
//插入右子树
parent.setRightChild(node);
}else
{
//插入左子树
parent.setLeftChild(node);
}
return node;
}else if(node.getData()==data)
{
return node;
}
else if(data>node.getData())
{
//右子树进行插入操作
return searchAndInsert(node,node.getRightChild(),data);
}
else
{
//左子树进行插入操作
return searchAndInsert(node,node.getLeftChild(),data);
}
}
//**************************************************************
//****************************二叉查找树的删除操作**********************************
public void delete(int data)
{
//对于根节点直接赋予空
if(root.getData()==data)
{
root=null;
return;
}
//整个过程需要知道父节点,因为java是引用传递,不能直接赋值
BinaryTreeNode parent=searchParent(data);
if(parent==null)
{
return ;
}
BinaryTreeNode node=search(parent,data);
//叶子节点直接删除
if(node.getLeftChild()==null&&node.getRightChild()==null)
{
if(parent.getLeftChild()!=null&&parent.getRightChild().getData()==data)
{
parent.setLeftChild(null);
}else
{
parent.setRightChild(null);
}
}
//左子树不为空
else if(node.getLeftChild()!=null&&node.getRightChild()==null)
{
if(parent.getLeftChild()!=null&&parent.getLeftChild().getData()==data)
{
//直接赋值为节点的左子树
parent.setLeftChild(node.getLeftChild());
}
else
{
//直接赋值为节点的右子树
parent.setRightChild(node.getLeftChild());
}
}
//右子树不为空
else if(node.getRightChild()!=null&&node.getLeftChild()==null)
{
if(parent.getLeftChild()!=null&&parent.getLeftChild().getData()==data)
{
parent.setLeftChild(node.getRightChild());
}else
{
parent.setRightChild(node.getRightChild());
}
}
//左右子树都不为空
else
{
//1.查找右子树最左子节点
BinaryTreeNode deleteNode=node;
//要删除节点的右子树树根
BinaryTreeNode temp=node.getRightChild();
if(temp.getLeftChild()==null)
{
temp.setLeftChild(deleteNode.getLeftChild());
}
else
{
//右子树的左孩子不为空
while(temp.getLeftChild()!=null)
{
node=temp;
temp=temp.getLeftChild();
}
//2.继承节点右子树上移
node.setLeftChild(temp.getRightChild());
//3.继承节点九尾
temp.setLeftChild(deleteNode.getLeftChild());
temp.setRightChild(deleteNode.getRightChild());
}
//4.更新父节点为删除节点的原父节点
if(parent.getLeftChild()!=null&&parent.getLeftChild().getData()==data)
{
parent.setLeftChild(temp);
}else
{
parent.setRightChild(temp);
}
}
}
//**************************************************************
//*****************************二叉查找树查找父节点*****************************************
/**
* 二叉查找树查找父节点
* @param data
* @return
*/
private BinaryTreeNode searchParent(int data) {
// TODO Auto-generated method stub
return searchParent(null,root,data);
}
private BinaryTreeNode searchParent(BinaryTreeNode parent, BinaryTreeNode node,int data)
{
if(node==null)
{
return null;
}else if(node.getData()==data)
{
return parent;
}
else if(data>node.getData())
{
//右子树查找
return searchParent(node,node.getRightChild(),data);
}else
{
//左子树查找
return searchParent(node,node.getLeftChild(),data);
}
}
//**********************************************************************
//***********************获取根节点***********************************************
public BinaryTreeNode getRoot()
{
return root;
}
}