用java实现一颗平衡二叉树ADT

本文介绍如何使用Java编程实现平衡二叉树抽象数据类型(ADT),包括添加、删除和查找元素等核心操作。通过自行编写代码,读者可以深入理解平衡二叉树的内部机制并快速应用到其他数据结构中。
摘要由CSDN通过智能技术生成

平衡二叉树是一颗能够确保能在O(lgn)渐进时间界进行查找的树。我编写一个类来对平衡二叉树进行操作,包括,添加元素,删除元素,查找元素等操作。我建议:对于数据结构,如果都能够自己编写一遍,不仅能够摸清其中的奥妙,而且可以快速入手其他结构。

简单实现代码如下:可以直接复制使用,或者转为自己的jar文件

package Com.Tree;

import java.util.Comparator;

/**
 * 注意:对于这个可变类,并未考虑线程安全的问题,也没有定义成不可变的类。主要体现平衡二叉树的实现方法。
 * 在这个类中,最关键的地方是平衡例程,即balance方法,而balance方法需要调用几个辅助方法来帮助判断和旋转。
 * 其余地方都与构建一颗二叉排序树ADT一样。
 * 搞几个列子,balance()断点一步步走一遍,摸清楚他的执行过程。
 * @author jane
 *
 * @param <T> 通用化处理,对于所有的可比较类(实现了comparable接口的类)都能进行排序。
 */
public class AVLSearchTree<T> {
	// declare the comparator
	private Comparator<? super T> cmp;

	private int myCompare(T lhs, T rhs) {
		if (cmp != null)
			return cmp.compare(lhs, rhs);
		else
			return ((Comparable) lhs).compareTo(rhs);

	}

	// the class of Node
	private static class AVLNode<T> {
		T element;
		AVLNode<T> left;
		AVLNode<T> right;
		int height;

		AVLNode(T theElement) {
			this(theElement, null, null);
		}

		AVLNode(T theElement, AVLNode<T> lt, AVLNode<T> rt) {
			element = theElement;
			left = lt;
			right = rt;
			height = 0;
		}
	}

	// 封装一颗二叉平衡树,对于所有的实例域都要私有化。
	private AVLNode<T> root;

	// 外部访问接口。
	public AVLSearchTree() {
		root = null;
	}

	public AVLSearchTree(Comparator<? super T> c) // 从外部注入比较器,默认从小到大
	{
		root = null;
		cmp = c;
	}

	public void makeEmpty() {
		root = null;
	}

	public boolean isEmpty() {
		return root == null;
	}

	// 是否包含
	public boolean contains(T x) {
		return contains(x, root);
	}

	// 找最小
	public T findMin() {
		if (isEmpty())
			throw new NullPointerException();
		return findMin(root).element;
	}

	public T findMax() {
		if (isEmpty())
			throw new NullPointerException();
		return findMax(root).element;
	}

	// 插入
	public void insert(T x) {
		root = insert(x, root);
	}

	// 删除
	public void remove(T x) {
		root = remove(x, root);
	}

	/**
	 * 三种遍历二叉树的方式,
	 * 
	 * @param type:参数0为先序遍历,参数1为中序遍历,2为后序遍历。默认为先序遍历
	 */
	public void printTree(int type)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值