二叉查找树

        二叉查找树或者是棵空树,或者满足下面的特性:

      (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;
	}
	
	

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值