二叉查找树的数据结构以及实现(JAVA)

package tree.binarytree;

//二叉查找树
public class BinarySearchTree<T> {
	private BinaryNode<T> root;
	private T element;
	int i=0;
	public BinarySearchTree(){
		this(null);
	}
	public BinarySearchTree(T element){
		this.root=null;
		this.element=element;
	}
	//判断树是否为空
	private boolean isEmpty(){
		return this.root==null;
	}
	//插入数据
	public void insert(T t)
    {
        this.root= insert(t,this.root);
    }

	private BinaryNode<T> insert(T theelement,BinaryNode<T> root){
		i++;
		if(root==null){
			System.out.println("第"+i+"步:  "+"在插入数据的位置创建一个节点 该节点的值是: "+theelement);
			return new BinaryNode<T>(theelement,null,null);
		}
		int compareResult=((Integer) theelement).compareTo((Integer) root.element);
		if(compareResult<0){
			System.out.println("第"+i+"步:  "+"将要插入的值为"+theelement+"比节点"+root.element+"小,将该值插入节点的左孩子");
			root.left=insert(theelement,root.left);
		}
		else if(compareResult>0){
			System.out.println("第"+i+"步:  "+"将要插入的值为"+theelement+"比节点"+root.element+"大,将该值插入节点的右孩子");
			root.right=insert(theelement,root.right);
		}
		else 
			System.out.println("第"+i+"步:  "+"存在等值的节点所以没有插入该节点 该节点的数据累加值为"+(root.k+1));
		return root;
	}
	//打印树的节点
	private void printTree(){
		if(isEmpty()){
			System.out.println("空树");
		}
		else
			printTree(root);
	}
	private void printTree(BinaryNode<T> root){
		if(root!=null){
			printTree(root.left);
			System.out.println(root.element);
			printTree(root.right);
		}
	}
	//查找节点的值是否存在
	public boolean contains(T t){
		return contains(t,root);
	}
	private boolean contains(T t,BinaryNode<T> root){
		if(root==null)
			return false;
		int compareResult=((Integer) t).compareTo((Integer)root.element);
		if(compareResult<0)
			return contains(t,root.left);
		else if(compareResult>0)
			return contains(t,root.right);
		else
		return true;
	}
	//找出最小的值
	private Integer findMin(){
		return (Integer)findMin(root).element;
	}
	private BinaryNode<T> findMin(BinaryNode<T> root){
		if(root==null)return null;
		else if(root.left==null) 
			return root;
			
		return findMin(root.left);
	}
	//找出最大的值
	private Integer findMax(){
		return (Integer)findMax(root).element;
	}
	private BinaryNode<T> findMax(BinaryNode<T> root){
		if(root==null)
			return null;
		else if(root.right==null)
			return root;
		else
			return findMax(root.right);
	}
	//删除一个节点
	private void remove(T t){
		this.root=remove(t,root);
	}
	private BinaryNode<T> remove(T t,BinaryNode<T> root){
		if(root==null){
			return root;
		}
		int compareResult=((Integer)t).compareTo((Integer)root.element);
		if(compareResult<0){
			root.left=remove(t,root.left );
		}
		else if(compareResult>0){
			root.right=remove(t,root.right);
		}
		else if(root.left!=null&&root.right!=null){
			root.element=findMin(root.right).element;//找出右子树最小值
			root.right=remove((T)root.element,root.right);
		}
		else 
			root=(root.left!=null)?root.left:root.right;
		return root;
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		BinarySearchTree<Integer> searchTree=new BinarySearchTree<Integer>();
		searchTree.insert(5);
		searchTree.insert(7);
		searchTree.insert(9);
		searchTree.insert(1);
		searchTree.insert(6);
		searchTree.insert(50);
		searchTree.insert(23);
		searchTree.insert(6);
		searchTree.printTree();
		System.out.println("是否含有6: "+searchTree.contains(8));
		System.out.println("查找到最小的是: "+searchTree.findMin());
		System.out.println("查找到最大的是: "+searchTree.findMax());
		searchTree.remove(9);
		searchTree.printTree();
	}

}
//定义二叉树的节点
class BinaryNode<T>{
	int k=1;//累计相同节点的个数
	Object element;
	BinaryNode<T> left;
	BinaryNode<T> right;
	public BinaryNode(T theelement){
		this(theelement,null,null);
	};
	public BinaryNode(T theelement,BinaryNode<T> left,BinaryNode<T> right){
		element=theelement;
		this.left=left;
		this.right=right;
	};
}
	


测试结果:

第1步:  在插入数据的位置创建一个节点 该节点的值是: 5
第2步:  将要插入的值为7比节点5大,将该值插入节点的右孩子
第3步:  在插入数据的位置创建一个节点 该节点的值是: 7
第4步:  将要插入的值为9比节点5大,将该值插入节点的右孩子
第5步:  将要插入的值为9比节点7大,将该值插入节点的右孩子
第6步:  在插入数据的位置创建一个节点 该节点的值是: 9
第7步:  将要插入的值为1比节点5小,将该值插入节点的左孩子
第8步:  在插入数据的位置创建一个节点 该节点的值是: 1
第9步:  将要插入的值为6比节点5大,将该值插入节点的右孩子
第10步:  将要插入的值为6比节点7小,将该值插入节点的左孩子
第11步:  在插入数据的位置创建一个节点 该节点的值是: 6
第12步:  将要插入的值为50比节点5大,将该值插入节点的右孩子
第13步:  将要插入的值为50比节点7大,将该值插入节点的右孩子
第14步:  将要插入的值为50比节点9大,将该值插入节点的右孩子
第15步:  在插入数据的位置创建一个节点 该节点的值是: 50
第16步:  将要插入的值为23比节点5大,将该值插入节点的右孩子
第17步:  将要插入的值为23比节点7大,将该值插入节点的右孩子
第18步:  将要插入的值为23比节点9大,将该值插入节点的右孩子
第19步:  将要插入的值为23比节点50小,将该值插入节点的左孩子
第20步:  在插入数据的位置创建一个节点 该节点的值是: 23
第21步:  将要插入的值为6比节点5大,将该值插入节点的右孩子
第22步:  将要插入的值为6比节点7小,将该值插入节点的左孩子
第23步:  存在等值的节点所以没有插入该节点 该节点的数据累加值为2
1
5
6
7
9
23
50
是否含有6: false
查找到最小的是: 1
查找到最大的是: 50
1
5
6
7
23
50

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
查找(Binary Search Tree)是一种常见的数据结构,它的每个节点最多有两个子节点,左子节点的值小于父节点的值,右子节点的值大于父节点的值。Java 实现查找的代码如下: ``` public class BinarySearchTree { private Node root; private class Node { private int key; private Node left; private Node right; public Node(int key) { this.key = key; } } public void insert(int key) { root = insert(root, key); } private Node insert(Node x, int key) { if (x == null) { return new Node(key); } if (key < x.key) { x.left = insert(x.left, key); } else if (key > x.key) { x.right = insert(x.right, key); } return x; } public boolean contains(int key) { return contains(root, key); } private boolean contains(Node x, int key) { if (x == null) { return false; } if (key == x.key) { return true; } else if (key < x.key) { return contains(x.left, key); } else { return contains(x.right, key); } } public void delete(int key) { root = delete(root, key); } private Node delete(Node x, int key) { if (x == null) { return null; } if (key < x.key) { x.left = delete(x.left, key); } else if (key > x.key) { x.right = delete(x.right, key); } else { if (x.left == null) { return x.right; } else if (x.right == null) { return x.left; } else { Node t = x; x = min(t.right); x.right = deleteMin(t.right); x.left = t.left; } } return x; } private Node min(Node x) { if (x.left == null) { return x; } else { return min(x.left); } } private Node deleteMin(Node x) { if (x.left == null) { return x.right; } x.left = deleteMin(x.left); return x; } } ``` 这段代码实现了二查找的插入、查找和删除操作。其中,插入操作使用递归实现查找和删除操作也是递归实现的。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值