Binary Search Tree 二叉查找树

本文介绍了二叉查找树的概念,这是一种特殊的二叉树,其中每个节点的左子树上的所有节点值都小于该节点,而右子树上的节点值都大于该节点。文章还涉及到二叉查找树的删除操作,包括三种不同情况的处理策略。

Binary Search Tree 二叉查找树

二叉查找树一种二叉树结构,其左子树比根节点小,右子树比根节点大。

定义接口

/**
 * 定义二叉查找树的接口。元素是可比较的。
 * 定义操作:判空、大小、包含、添加、删除、前序遍历、中序遍历、后续遍历
 */
public interface BinarySearchTree <T extends Comparable<T>> {
	
	public boolean isEmpty();
	
	public int size();

	public boolean contains(T item);
	
	public void add(T item);
	
	public void remove(T item);
	
	public List<T> preorder();
	
	public List<T> inorder();
	
	public List<T> postorder();
	
	public List<T> levelorder();
	
}
递归实现

/**
 * 二叉查找树的递归实现
 */
public class BSTRecursive<T extends Comparable<T>> implements BinarySearchTree<T> {
	private Node<T> root;
	private int size;
	
	@Override
	public boolean isEmpty() {
		return size == 0;
	}

	@Override
	public int size() {
		return size;
	}

	@Override
	public boolean contains(T item) {
		return containsRecursive(root, item);
	}
	
	private boolean containsRecursive(Node<T> root,T item) {
		if (root == null) {
			return false;
		}
		int cmp = root.item.compareTo(item); 
		// 如果root大于item,查左子树
		if (cmp > 0) {
			return containsRecursive(root.left, item);
		} else if(cmp == 0) {
			return true;
		} else {
			return containsRecursive(root.right, item);
		}
	}

	@Override
	public void add(T item) {
		root = addRecursive(root, item);
	}
	
	private Node<T> addRecursive(Node<T> root, T item) {
		if (root == null) {
			size++;
			return new Node<T>(item);
		}
		int cmp = root.item.compareTo(item); 
		if (cmp > 0) {
			root.left = addRecursive(root.left, item);
		} else if(cmp < 0) {
			root.right = addRecursive(root.right, item);;
		}
		return root;
	}

	@Override
	public void remove(T item) {
		root = removeRecursive(root, item);
	}
	
	// 删除时,是用右子树最小的来替换
	private Node<T> removeRecursive(Node<T> root, T item) {
		if (root == null) {
			return null;
		}
		int cmp = root.item.compareTo(item);
		if (cmp > 0) {
			root.left = removeRecursive(root.left, item);
		} else if(cmp < 0) {
			root.right = removeRecursive(root.right, item);
		} else {
			size--;
			if (root.left == null) {
				return root.right;
			}
			if (root.right == null) {
				return r
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值