二叉搜索树

二叉搜索树:二叉搜索树的数据结构特点是一个父节点的左孩子都比这个父节点的值要小,右孩子节点上的值都比这个父节点的值要大。二分搜索树的常用遍历方法有前序遍历,中序遍历,后序遍历。如果用递归的方法进行遍历的话,就是输出语句在递归前的位置,因为如果用递归的话,每个节点都会访问三次,而不同的遍历方式就是在第几次访问这个节点时进行输出。中序遍历其实就是按照从小到大的顺序进行输出。一个完全二叉搜索树的排序的时间复杂度是O(logn)。这比在数组或者链表进行查找元素O(n)要快的多。如果数据不合适,二叉搜索树可能退化为数组或者链表。

public class Node {
	public int val;
	public Node left ;
	public Node right;
	public Node(int val,Node left,Node right) {
		this.val = val;
		this.left = left;
		this.right = right;
	}
	public Node(int val) {
		this(val,null,null);
	}

}
public class Tree {
	private Node root;
	public Tree() {
		root = null;
	}
	private int size;
	
	public int getSize() {
		return size;
	}
	public boolean isEmpty() {
		return size == 0;
	}
	
	public void add(int val) {
		root = insert(val, root);
	}
	private Node insert(int val,Node root) {
		if(root == null) {
			size++;
			return new Node(val);
		}
		int temp = root.val;
		
		if(val<temp) {
			root.left = insert(val,root.left);
		}
		else if(val > temp) {
			root.right = insert(val,root.right);
		}
		return root;
	}
	
	
	public boolean contains(int val) {
		return contains(val,root);
	}
	private boolean contains(int val,Node root) {
		if(root == null) {
			return false;
		}
		int temp = root.val;
		
		if(temp < val) {
			return contains(val,root.left);
		}
		else if(temp > val) {
			return contains(val,root.right);
		}
		return true;
	}
	
	
	public int findMin() {
		if(root == null) {
			 throw new IllegalArgumentException("空树");
		}
		return findMin(root).val;
	}
	private Node findMin(Node root) {
		if(root.left == null) {
			return root;
		}
		return findMin(root.left);
	}
	
	
	public int findMax() {
		if(root == null) {
			 throw new IllegalArgumentException("空树");
		}
		return findMax(root).val;
	}
	private Node findMax(Node root) {
		
		if(root.right == null) {
			return root;
		}
		return findMax(root.right);
	}
	
	
	public void remove(int val) {
		if(root == null) {
			return ;
		}
		remove(val,root);
	}
	private Node remove(int val,Node root) {
		if(root == null) {
			throw new IllegalArgumentException("没有找到要删除的数");
		}
		int  temp = root.val;
		
		if(val < temp ) {
			root.left = remove(val,root.left);
		}
		else if(val > temp) {
			root.right = remove(val,root.right);
		}
		else if(root.left!= null && root.right != null) {
			root.val = findMin(root.right).val;
			root.right = remove(root.val,root.right);
		}
		else {
			root = (root.left !=null)?root.left :root.right;
			size--;
		}
		return root;
			
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值