二叉查找树的一些方法

package BinarySearchTreeHomework;
public class Tree {
	 Node root;
	   Node pointer;
	   public Tree()
	   {
	   }
	   //按照输入的次序建立二叉查找树
	   public void BuildTree(int value)
	   {
		   Node node=new Node(value);
		   if(root==null)
		   {
			   root=node;
		   }
		   else
		   {
			   pointer=root;
			   Node q=pointer;
			   while(pointer!=null)
			   {
				   if(pointer.getValue()>value)
				   {
					 q=pointer;
					 pointer=pointer.getLeft();
				   }
				   else if(pointer.getValue()<value)
				   {
					   q=pointer;
					   pointer=pointer.getRight();
				   }
			   }
				   if(q.getValue()>value) 
				   {

						 q.LinkLeft(node);
				   }
					  
				   else if(q.getValue()<value)
				   {
					    q.LinkRight(node); 
				   }
					
			  
		   }
	   }
	   //将树清空
   public void MakeEmpty()
   {
		   root.LinkLeft(null);
		   root.LinkRight(null);
   }
   //打印出找到那个节点的路径
   public void Find(int value)
	   {
		pointer=root;
		while(pointer.getValue()!=value)
		{
		   if(pointer.getValue()>value)
		     {
			    System.out.print(pointer.getValue()+"->");
			      pointer=pointer.getLeft();
		     }
		    else if(pointer.getValue()<value)
		     {
			     System.out.print(pointer.getValue()+"->");
			       pointer=pointer.getRight(); 	
		     }
		
	   }
		System.out.println(value);
	}
   //找最小值并输出找最小值的路径
   public void FindMin()
   {
	   pointer=root;
	   while(pointer.getLeft()!=null)
	   {
		   System.out.print(pointer.getValue()+"->");
		   pointer=pointer.getLeft();
	   }
	   System.out.println(pointer.getValue());
   }
   //找最大值并输出找最大值的路径
   public void FindMax()
   {
	   pointer=root;
	   while(pointer.getRight()!=null)
	   {
		   System.out.print(pointer.getValue()+"->");
		   pointer=pointer.getRight();
	   }
	   System.out.println(pointer.getValue());
   }
   //在查找二叉树钟插入一个值
  public void Insert(int value)
   {
		   Node node=new Node(value);
			   pointer=root;
			   Node q=pointer;
			   while(pointer!=null)
			   {
				   if(pointer.getValue()>value)
				   {
					 q=pointer;
					 pointer=pointer.getLeft();
				   }
				   else if(pointer.getValue()<value)
				   {
					   q=pointer;
					   pointer=pointer.getRight();
				   }
			   }
				   if(q.getValue()>value) 
				   {

						 q.LinkLeft(node);
				   }
					  
				   else if(q.getValue()<value)
				   {
					    q.LinkRight(node); 
				   }
					
	Print(root);	
	System.out.println();
  }
  //在查找二叉树钟删去一个值
    //分三种情况讨论的:
  //没有子节点直接删掉
  //有一个子节点将子节点替换当前结点
  //有两个子节点:找到右子树的最小值代替当前值(注意体会右子树的最小值只可能有两种情况,有一个右结点或者没有子节点,参照上面的删掉最小值)
  public void Delete(int value)
  {
	  pointer=root;
	  Node q=pointer;
		while(pointer.getValue()!=value)
		{
		   if(pointer.getValue()>value)
		   {
			   q=pointer;
			   pointer=pointer.getLeft();  
		   }  
		    else if(pointer.getValue()<value)
		    {
		      q=pointer;
		       pointer=pointer.getRight(); 	
		    }
	   }  
	if(pointer.getLeft()==null && pointer.getRight()==null) 
	{
		if(q.getLeft()==pointer) q.LinkLeft(null);
		if(q.getRight()==pointer) q.LinkRight(null);
	}
	if(pointer.getLeft()==null && pointer.getRight()!=null)
	{
		if(q.getLeft()==pointer) q.LinkLeft(pointer.getRight());
		if(q.getRight()==pointer) q.LinkRight(pointer.getRight());
	}
	if(pointer.getLeft()!=null && pointer.getRight()==null)
	{
		if(q.getLeft()==pointer) q.LinkLeft(pointer.getLeft());
		if(q.getRight()==pointer) q.LinkRight(pointer.getLeft());
	}
	if(pointer.getLeft()!=null&&pointer.getRight()!=null)
	{
		Node deletenode=pointer;

		Node q2=pointer;
		pointer=pointer.getRight();
		while(pointer.getLeft()!=null)
		{
			q2=pointer;
			pointer=pointer.getLeft();
		}
		deletenode.value=pointer.getValue();
		if(pointer.getLeft()==null && pointer.getRight()==null) 
		{
			if(q2.getLeft()==pointer) q2.LinkLeft(null);
			if(q2.getRight()==pointer) q2.LinkRight(null);
		}
		if(pointer.getLeft()==null && pointer.getRight()!=null)
		{
			if(q2.getLeft()==pointer) q2.LinkLeft(pointer.getRight());
			if(q2.getRight()==pointer) q2.LinkRight(pointer.getRight());
		}
		
	}
	Print(root);
	System.out.println();
  }
  public void Retrieved(Node node)
  {
	  pointer=root;
		while(pointer.getValue()!=node.getValue())
		{
		   if(pointer.getValue()>node.getValue())
		     {
			    System.out.print(pointer.getValue()+"->");
			      pointer=pointer.getLeft();
		     }
		    else if(pointer.getValue()<node.getValue())
		     {
			     System.out.print(pointer.getValue()+"->");
			       pointer=pointer.getRight(); 	
		     }
		
	   }
		System.out.println(node.getValue()); 
  }
 public void Print(Node node)
 {
	if(node==null) return ;
	else
	{

		System.out.print(node.getValue()+" ");
		Print(node.getLeft());
		Print(node.getRight());
	}
 }
}
class Node{
	Node left,right;
	int value;
	public Node(){}
	public Node(int value)
	{
		this.value=value;
	}
	public void LinkLeft(Node node)
	{
		this.left=node;
	}
	public Node getLeft()
	{
		return this.left;
	}
	public void LinkRight(Node node)
	{
		this.right=node;
	}
	public Node getRight()
	{
		return this.right;
	}
	public int getValue()
	{
		return this.value;
	}
}

package BinarySearchTreeHomework;

import java.util.Scanner;
public class MainMethod {
	public static void main(String[] args)
	{
		int a[]={35,17,18,15,22,60,51, 88,93};
		Scanner input=new Scanner(System.in);
		Tree tree=new Tree();
		for(int i=0;i<9;i++)
		{
		 
		   tree.BuildTree(a[i]);
		   
		}
		tree.Find(18);
		tree.FindMax();
		tree.FindMin();
		tree.Insert(20);
		Node node=new Node(60);
		tree.Retrieved(node);
		tree.Delete(60);
		
		tree.MakeEmpty();
		
	}

}

运行结果:

35->17->18
35->60->88->93
35->17->15
35 17 15 18 22 20 60 51 88 93 
35->60
35 17 15 18 22 20 88 51 93 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值