查找二叉树

什么是二叉树?

二叉树是一个每个结点至多只有两个子结点的树


二叉树的实现
二叉树的每个结点必须包含三个信息:1、结点所代表的元素   2、左边的子节点(若没有左子节点则为null)  3、右边的子节点(若没有右子节点则为null)。每个结点的结构如下所示:




什么是查找二叉树?
查找二叉树是一种特殊的二叉树它满足:对于树中的每个结点X,它的左子树中所有项的值小于X的值,而他右子树中所有项的值大于X的值


查找二叉树的实现代码
包含了插入、删除操作

class BinarySearchTree<T>
{
	
	private Comparator<? super T> cmp;
	private BinaryNode<T> root;
	private static class BinaryNode<T>
	{
		BinaryNode<T> left;
		BinaryNode<T> right;
		T data;
		public BinaryNode(BinaryNode<T> left,BinaryNode<T> right,T data)
		{
			this.left=left;
			this.right=right;
			this.data=data;
		}
	}
	
	public BinarySearchTree()
	{
		this(null);
	}
	
	public BinarySearchTree(Comparator<T> cmp)
	{
		root=null;
		this.cmp=cmp;
	}
	
	public void makeEmpty()
	{
		root=null;
	}
	
	public boolean isEmpty()
	{
		return root==null;
	}
	
	public T findMin()
	{
		if(findMin(root)==null)
		{
			return null;
		}
		return findMin(root).data;
	}
	
	public T findMax()
	{
		if(findMax(root)==null)
		{
			return null;
		}
		return findMax(root).data;
	}
	
	public void insert(T x)
	{
		insert(x, root);
	}
	
	public void remove(T x)
	{
		remove(x, root);
	}
	
	private void insert(T x,BinaryNode<T> t)
	{	
		if (t==null)
		{
			root=new BinaryNode<T>(null, null, x);
			return;
		}
		
		int comResult=compare(x, t.data);
		if(comResult>0)
		{
			if (t.right==null)
			{
				t.right=new BinaryNode<T>(null, null, x);
				return;
			}
			else
			{
				insert(x,t.right);
			}
			
		}
		else if (comResult<0)
		{
			if (t.left==null)
			{
				t.left=new BinaryNode<T>(null, null, x);
				return;
			}
			else {
				insert(x,t.left);
			}
			
		}
		
	}
	
	private BinaryNode<T> remove(T x,BinaryNode<T> t)
	{
		if(t==null)
		{
			return null;
		}
		int comResult=compare(x, t.data);
		if(comResult>0)
		{ 
			t.right=remove(x, t.right);
		}
		else if (comResult<0)
		{
			t.left=remove(x,t.left);
		}
		else if(t.left!=null && t.right!=null)
		{
			t.data=findMin(t.right).data;
			t.right=remove(t.data,t.right);
			/**
			 * 上面的语句可用下面两句替代
			 * t.data=findMax(t.left).data;
			 * t.left=remove(t.data,t.left);
			 */
		}
		else
		{
			t=(t.left!=null) ? t.left : t.right;//
		}
		return t;
	}
	
	private BinaryNode<T> findMin(BinaryNode<T> b)
	{
		if(b==null)
		{
			return null;
		}
		else if(b.left==null)
		{
			return b;
		}
		return findMin(b.left);
	}
	
	private BinaryNode<T> findMax(BinaryNode<T> b)
	{
		if(b==null)
		{
			return null;
		}
		else if (b.right==null)
		{
			return b;
		}
		return findMax(b.right);
	}
	
	private int compare(T a,T b)
	{
		if (cmp!=null)
		{
			return cmp.compare(a, b);
		}
		else {
			return ((Comparable)a).compareTo(b);
		}
	}
/****************************下面的代码是为了打印出二叉树,不属于二叉树的具体实现********************/	
//层序遍历
	public void printTree()
	{
		Queue<BinaryNode<T>> queue=new LinkedList<BinaryNode<T>>();
		queue.offer(root);
		BinaryNode<T> node;
		int current=0;
		int last=0;
		while (!queue.isEmpty())
		{
			last=queue.size();
			current=0;
			while (current<last)
			{	
				node=queue.poll();
				System.out.print(node.data+" ");
				if(node.left!=null)
				{
					queue.offer(node.left);
				}
				if (node.right!=null)
				{
					queue.offer(node.right);
				}
				current++;
			}
			System.out.println();
		}
		
	}
	
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值