排序二叉树的实现 Java版

排序二叉树的接口

package tree;

/**
 * 二叉排序树
 * 
 * @author liangguojun
 * 
 * @param <T>
 *            数据类型
 */
public interface SortTree<T extends Comparable<T>> {
	// 降序
	public static final int DESC_DATA = 0;
	// 升序
	public static final int ASC_DATA = 1;

	/**
	 * 清空排序二叉树
	 */
	public void clear();

	/**
	 * 返回排序二叉树的深度
	 * 
	 * @return 返回排序二叉树的深度
	 */
	public int getDept();

	/**
	 * 判断二叉排序树是否为空
	 * 
	 * @return 若二叉树为空返回true,否则返回false
	 */
	public boolean isEmpty();

	/**
	 * 返回二叉树的长度
	 * 
	 * @return 返回排序二叉树的长度
	 */
	public int getLength();

	/**
	 * 插入节点
	 * 
	 * @param data
	 *            插入节点的数据
	 * @return 成功插入则返回true , 否则返回false
	 */
	public boolean insert(T data);

	/**
	 * 查询数据data
	 * 
	 * @param data
	 *            数据
	 * @return 成功查找则返回true,否则返回false
	 */
	public boolean search(T data);

	/**
	 * 遍历二叉树,根据参数是升序还是降序打印所有元素
	 * 
	 * @param order_by
	 *            升序或降序的控制单位
	 */
	public void view(int order_by);

	/**
	 * 删除数据元素为data的节点
	 * 
	 * @param data
	 *            数据元素
	 * @return 成功删除则返回被删除的元素
	 */
	public T deleteData(T data);

	/**
	 * 修改二叉树的节点数据
	 * 
	 * @param data
	 *            替换的数据
	 * @param move
	 *            将要被替换 的数据
	 * @return 成功替换则返回true,否则返回false
	 */
	public boolean updateData(T data, T move);
}


排序二叉树的实现,省略节点类


package tree;

/**
 * 排序二叉树
 * @author liangguojun
 *
 * @param <T>
 */
public class SortBirTree<T extends Comparable<T>> implements SortTree<T> {
	private TNode<T> root;

	public SortBirTree() {
		root = null;
	}

	@Override
	public void clear() {
		root = null;
	}

	/**
	 * 私有方法,此方法是计算二叉树的深度
	 * 
	 * @param cur
	 *            参数是二叉树的根节点
	 * @return 返回排序二叉树的深度
	 */
	private int getDept(TNode<T> cur) {
		if (cur != null) {
			int ldept = 0;
			int rdept = 0;
			// 递归遍历左子树和右子树的深度
			ldept = getDept(cur.getlChild()) + 1;
			rdept = getDept(cur.getrChild()) + 1;
			return ldept > rdept ? ldept : rdept;
		}
		return 0;
	}

	@Override
	public int getDept() {
		return getDept(root);
	}

	@Override
	public boolean isEmpty() {
		if (root == null) {
			return true;
		}
		return false;
	}

	/**
	 * 求cur的子树的长度
	 * 
	 * @param cur
	 *            子树
	 * @return 返回cur子树的所有节点的个数,不包括cur
	 */
	private int getLength(TNode<T> cur) {
		if (cur != null) {
			int lLength = 0;
			int rLength = 0;
			// 递归调用方法,遍历左右子树,求出各子树的节点数
			if (cur.getlChild() != null)
				lLength = getLength(cur.getlChild()) + 1;
			if (cur.getrChild() != null) {
				rLength = getLength(cur.getrChild()) + 1;
			}
			return lLength + rLength;
		}
		return 0;
	}

	@Override
	public int getLength() {
		if (root != null)
			return getLength(root) + 1;
		return 0;
	}

	private boolean insert(T data, TNode<T> cur) {
		if (data != null) {
			if (root == null) {
				root = new TNode<T>(data);
				return true;
			}
			// 假如插入的数据比当前节点大,且cur右节点为空,则插入有节点
			if (cur.getData().compareTo(data) < 0) {
				if (cur.getrChild() == null) {
					cur.setrChild(new TNode<T>(data));
					return true;
				}
				// cur右孩子不为空,则继续调用插入方法
				else
					return insert(data, cur.getrChild());
			} else {
				// 假如插入的数据比当前节点的小,且cur左孩子为空,则插入节点
				if (cur.getData().compareTo(data) > 0) {
					if (cur.getlChild() == null) {
						cur.setlChild(new TNode<>(data));
						return true;
					} else
						return insert(data, cur.getlChild());
				}
			}
		}
		return false;
	}

	@Override
	public boolean insert(T data) {
		return insert(data, root);
	}

	private boolean search(T data, TNode<T> cur) {
		if (data != null && cur != null) {
			// 假如查找的数据比cur小,则去左孩子继续查询
			if (cur.getData().compareTo(data) > 0) {
				return search(data, cur.getlChild());
			} else if (cur.getData().compareTo(data) < 0) {
				// 假如查找的数据比cur 大,则去右孩子继续查询
				return search(data, cur.getrChild());
			} else if (cur.getData().compareTo(data) == 0)
				// 查找成功
				return true;
		}
		return false;
	}

	@Override
	public boolean search(T data) {
		return search(data, root);
	}

	/**
	 * 升序排序遍历二叉树
	 * 
	 * @param cur
	 *            子树的根节点
	 */
	private void viewASC(TNode<T> cur) {
		if (cur != null) {
			viewASC(cur.getlChild());
			System.out.print(cur.getData() + " ");
			viewASC(cur.getrChild());
		}
	}

	private void viewDESC(TNode<T> cur) {
		if (cur != null) {
			viewDESC(cur.getrChild());
			System.out.print(cur.getData() + " ");
			viewDESC(cur.getlChild());
		}
	}

	@Override
	public void view(int order_by) {

		if (order_by == DESC_DATA) {

			viewDESC(root);
			System.out.println();
		} else if (order_by == ASC_DATA) {
			viewASC(root);
			System.out.println();
		} else {
			System.out.println("传入的参数不正确");
		}
	}

	/**
	 * 删除指定的节点
	 * 
	 * @param cur
	 *            被删除的节点
	 * @param parent
	 *            被删除节点的双亲节点
	 * @return 成功删除则返回true,否则返回false
	 */
	private T delete(TNode<T> cur, TNode<T> parent) {
		if (cur != null) {
			if (cur.getlChild() == null) {
				// 判断是否为根节点
				if (parent != null) {
					if (parent.getlChild() == cur) {
						parent.setlChild(cur.getrChild());
					} else if (parent.getrChild() == cur) {
						parent.setrChild(cur.getrChild());
					}
				} else {
					// 如果删除的是根节点,则为根节点赋值
					root = cur.getrChild();
				}
			} else if (cur.getrChild() == null) {
				// 判断是否为根节点
				if (parent != null) {
					if (parent.getlChild() == cur) {
						parent.setlChild(cur.getlChild());
					} else if (parent.getrChild() == cur) {
						parent.setrChild(cur.getlChild());
					}
				} else {
					// 如果删除的是根节点,则为根节点赋值
					root = cur.getlChild();
				}
			}
			// 左右孩子都不为空
			else {
				TNode<T> s = cur;
				TNode<T> tmp = cur.getlChild();
				while (tmp.getrChild() != null) {
					s = tmp;
					tmp = tmp.getrChild();
				}
				// 把tmp节点拿去替换被删除的节点,修改tmp的双亲的子树
				s.setrChild(tmp.getlChild());

				// 判断删除的cur是否为根节点
				if (parent != null) {
					if (parent.getlChild() == cur) {
						parent.setlChild(tmp);
						tmp.setlChild(cur.getlChild());
						tmp.setrChild(cur.getrChild());
					} else if (parent.getrChild() == cur) {
						parent.setrChild(tmp);
						tmp.setlChild(cur.getlChild());
						tmp.setrChild(cur.getrChild());
					}
				} else {
					root = tmp;
					tmp.setlChild(cur.getlChild());
					tmp.setrChild(cur.getrChild());
				}
			}
			return cur.getData();
		}
		return null;
	}

	/**
	 * 删除数据元素data
	 * 
	 * @param data
	 *            被删除的数据元素
	 * @param cur
	 *            指定所要删除的元素所在的子树
	 * @param parent
	 *            子树的双亲节点
	 * @return 成功三楚则返回true,否则返回false
	 */
	private T deleteData(T data, TNode<T> cur, TNode<T> parent) {
		if (data != null && cur != null) {
			if (data.compareTo(cur.getData()) > 0) {
				return deleteData(data, cur.getrChild(), cur);
			} else if (data.compareTo(cur.getData()) < 0) {
				return deleteData(data, cur.getlChild(), cur);
			} else
				return delete(cur, parent);
		}
		return null;
	}

	@Override
	public T deleteData(T data) {
		// TODO
		return deleteData(data, root, null);
	}

	/**
	 * 把二叉树中数据为move的节点数据修改成data
	 * 
	 * @param data
	 *            替换的数据
	 * @param move
	 *            别替换的数据
	 * @param cur
	 *            二叉树节点
	 * @return 成功替换则返回true,否则返回false
	 */
	private boolean updateData(T data, T move, TNode<T> cur) {
		if (data != null && cur != null) {
			deleteData(move);
			return insert(data);

		}
		return false;
	}

	@Override
	public boolean updateData(T data, T move) {
		return updateData(data, move, root);
	}

	public TNode<T> getRoot() {
		return root;
	}

	public void setRoot(TNode<T> root) {
		this.root = root;
	}

	public static void main(String[] args) {
		String[] a = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J" };
		SortBirTree<String> test = new SortBirTree<>();
		for (int i = 0; i < a.length; i++) {
			test.insert(a[i]);
		}
		// test.insert(38);
		test.view(ASC_DATA);
		System.out.println("排序二叉树的深度 " + test.getDept());
		System.out.println("排序二叉树的长度为:" + test.getLength());
		// test.clear();
		// System.out.println("二叉树是否为空?:" + test.isEmpty());
		// System.out.println("删除47:" + test.deleteData(47));
		// test.view(SortBirTree.ASC_DATA);
		// test.insert(20);
		// test.view(ASC_DATA);
		// System.out.println("修改88的值:" + test.updateData(56, 88));
		// test.deleteData(88);
		// test.view(ASC_DATA);
		// System.out.println("排序二叉树的深度 " + test.getDept());
		// System.out.println("查:" + test.search(62));
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值