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