import java.util.Stack;
import java.util.Comparator;
public class BST<E> extends AbstractTree<E> implements Cloneable{
private Comparator<? super E> comparator;
protected TreeNode<E> root;
protected int size = 0;
/** Create a default binary search tree */
public BST() {
}
/** Create a binary search tree from an array of objects */
public BST(E[] objects) {
for (int i = 0; i < objects.length; i++)
insert(objects[i]);
}
public BST(Comparator<? super E> comparator) {
this.comparator = comparator;
}
public boolean search(E e) {
TreeNode<E> current = root; // Start from the root
while (current != null) {
if (comparator.compare(e, current.element) < 0) {
current = current.left; // Go left
}
else if (comparator.compare(e, current.element) > 0) {
current = current.right; // Go right
}
else // Element matches current.element
return true; // Element is found
}
return false; // Element is not in the tree
}
public boolean insert(E e) {
if (root == null)
root = createNewNode(e); // Create a new root
else {
// Locate the parent node
TreeNode<E> parent = null;
TreeNode<E> current = root;
while (current != null) {
if (comparator.compare(e, current.element) < 0) {
parent = current;
current = current.left;
}
else if (comparator.compare(e, current.element) > 0) {
parent = current;
current = current.right;
}
else
return false; // Duplicate node not inserted
}
// Create the new node and attach it to the parent
if (comparator.compare(e, parent.element) < 0)
parent.left = createNewNode(e);
else
parent.right = createNewNode(e);
}
size++;
return true; // Element inserted successfully
}
protected TreeNode<E> createNewNode(E e) {
return new TreeNode<>(e);
}
@Override /** Inorder traversal from the root */
public void inorder() {
inorder(root);
}
/** Inorder traversal from a subtree */
protected void inorder(TreeNode<E> root) {
if (root == null) return;
inorder(root.left);
System.out.print(root.element + " ");
inorder(root.right);
}
@Override /** Postorder traversal from the root */
public void postorder() {
postorder(root);
}
/** Postorder traversal from a subtree */
protected void postorder(TreeNode<E> root) {
if (root == null) return;
postorder(root.left);
postorder(root.right);
System.out.print(root.element + " ");
}
@Override /** Preorder traversal from the root */
public void preorder() {
preorder(root);
}
/** Preorder traversal from a subtree */
protected void preorder(TreeNode<E> root) {
if (root == null) return;
System.out.print(root.element + " ");
preorder(root.left);
preorder(root.right);
}
/** This inner class is static, because it does not access
any instance members defined in its outer class */
public static class TreeNode<E> {
protected E element;
protected TreeNode<E> left;
protected TreeNode<E> right;
public TreeNode(E e) {
element = e;
}
}
@Override /** Get the number of nodes in the tree */
public int getSize() {
return size;
}
/** Returns the root of the tree */
public TreeNode<E> getRoot() {
return root;
}
/** Return a path from the root leadting to the specified element */
public java.util.ArrayList<TreeNode<E>> path(E e) {
java.util.ArrayList<TreeNode<E>> list =
new java.util.ArrayList<>();
TreeNode<E> current = root; // Start from the root
while (current != null) {
list.add(current); // Add the node to the list
if (comparator.compare(e, current.element) < 0) {
current = current.left;
}
else if (comparator.compare(e, current.element) > 0) {
current = current.right;
}
else
break;
}
return list; // Return an array list of nodes
}
@Override /** Delete an element from the binary search tree.
* Return true if the element is deleted successfully.
* Return false if the element is not in the tree. */
public boolean delete(E e) {
//Locate the node to be deleted and also locate its parent node
TreeNode<E> parent = null;
TreeNode<E> current = root;
while (current != null) {
if (comparator.compare(e, current.element) < 0) {
parent = current;
current = current.left;
}
else if (comparator.compare(e, current.element) > 0) {
parent = current;
current = current.right;
}
else
break; // Element is in the tree pointed at by current
}
if (current == null)
return false; // Element is not in the tree
// Case 1: current has no left child
if (current.left == null) {
// Connect the parent with the right child of the current node
if (parent == null) {
root = current.right;
}
else {
if (comparator.compare(e, parent.element) < 0)
parent.left = current.right;
else
parent.right = current.right;
}
}
else {
// Case 2: The current node has a left child.
// Locate the rightmost node in the left subtree of
// the current node an also its parent.
TreeNode<E> parentOfRightMost = current;
TreeNode<E> rightMost = current.left;
while (rightMost.right != null) {
parentOfRightMost = rightMost;
rightMost = rightMost.right; // Keep going to the right
}
// Replace the element in current by the element in rightMost
current.element = rightMost.element;
// Eliminate rightmost node
if (parentOfRightMost.right == rightMost)
parentOfRightMost.right = rightMost.left;
else
// Special case: parentOfRightMost == current
parentOfRightMost.left = rightMost.left;
}
size--;
return true; // Element deleted successfully
}
@Override /** Obtain an iterator. Use inorder. */
public java.util.Iterator<E> iterator() {
return new InorderIterator();
}
// Inner class InorderIterator
private class InorderIterator implements java.util.Iterator<E> {
// Store the elements in a list
private java.util.ArrayList<E> list =
new java.util.ArrayList<>();
private int current = 0; // Point to the current element in list
public InorderIterator() {
inorder(); // Traverse binary tree and store elements in list
}
/** Inorder traversal from the root */
private void inorder() {
inorder(root);
}
/** Inorder traversal from a subtree */
private void inorder(TreeNode<E> root) {
if (root == null) return;
inorder(root.left);
list.add(root.element);
inorder(root.right);
}
@Override /** More elements for traversing? */
public boolean hasNext() {
if (current < list.size())
return true;
return false;
}
@Override /** Get the current element and move to the next */
public E next() {
return list.get(current++);
}
@Override /** Remove the current element */
public void remove() {
delete(list.get(current)); // Delete the current element
list.clear(); // Clear the list
inorder(); // Rebuild the list
}
}
/** Remove all elements from the tree */
public void clear() {
root = null;
size = 0;
}
/** Displays the nodes in a breadth-first traversal */
public void breadthFirstTraversal() {
if (root == null) return;
java.util.Queue<TreeNode<E>> queue = new java.util.LinkedList<>();
queue.add(root);
while (!queue.isEmpty()){
TreeNode<E> current = queue.element();
if (current.left != null) {
queue.add(current.left);
}
if (current.right != null) {
queue.add(current.right);
}
System.out.print(queue.remove().element + " ");
}
}
/** Returns the height of this binary tree */
public int height() {
return height(root);
}
/** Height from a subtree */
protected int height(TreeNode<E> root) {
if (root == null) return 0;
return 1 + Math.max(height(root.left), height(root.right));
}
/** Returns true if the tree is a full binary tree */
public boolean isFullBST() {
return size == Math.pow(2, height()) - 1 ? true : false;
}
/** Returns the number of leaf nodes */
public int getNumberOfLeaves() {
return getNumberOfLeaves(root);
}
/** Returns the num
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
java语言程序设计课后习题解析答案(第10版) (2009个子文件)
.smbdeleteBAA056a4.4 11KB
.smbdeleteAAA04e84.4 9KB
.smbdeleteAAA02954.4 4KB
.smbdeleteBAA02be4.4 4KB
.smbdeleteAAA01084.4 3KB
.smbdeleteAAA07ae4.4 3KB
.smbdeleteAAA02c84.4 3KB
.smbdeleteBAA02c84.4 2KB
.smbdeleteAAA02be4.4 2KB
.smbdeleteAAA01b54.4 2KB
.smbdeleteAAA02f74.4 2KB
.smbdeleteAAA029d4.4 2KB
.smbdeleteAAA10e94.4 2KB
.smbdeleteAAA052e4.4 2KB
.smbdeleteAAA04224.4 2KB
.smbdeleteAAA03004.4 2KB
.smbdeleteBAA02954.4 2KB
.smbdeleteBAA03394.4 1KB
.smbdeleteBAA03b54.4 1KB
.smbdeleteAAA02734.4 1KB
.smbdeleteAAA03764.4 1KB
.smbdeleteAAA02734.4 1KB
.smbdeleteAAA091b4.4 1KB
.smbdeleteAAA01634.4 1KB
.smbdeleteBAA04e84.4 1KB
.smbdeleteAAA03b54.4 1020B
.smbdeleteAAA1ceb4.4 897B
.smbdeleteAAA03cd4.4 887B
.smbdeleteAAA034f4.4 863B
.smbdeleteAAA01884.4 819B
.smbdeleteAAA02634.4 660B
.smbdeleteAAA056a4.4 660B
.smbdeleteAAA028b4.4 637B
.smbdeleteAAA025a4.4 607B
.smbdeleteAAA03964.4 590B
.smbdeleteAAA32cc4.4 583B
.smbdeleteAAA022d4.4 581B
.smbdeleteAAA036c4.4 567B
.smbdeleteAAA052e4.4 533B
.smbdeleteAAA02f54.4 514B
.smbdeleteAAA0c2f4.4 498B
.smbdeleteAAA16e04.4 498B
.smbdeleteAAA023c4.4 414B
.smbdeleteAAA01af4.4 345B
.smbdeleteAAA111d4.4 332B
.smbdeleteAAA02c84.4 303B
.smbdeleteAAA03394.4 86B
Exercise_16_08.class 8KB
Exercise_20_13.class 7KB
Exercise31_06Client.class 6KB
Exercise_17_09.class 6KB
Exercise_23_06.class 6KB
Exercise_15_22.class 6KB
TablePane.class 6KB
BST.class 6KB
BST.class 6KB
BST.class 6KB
Exercise_21_11.class 5KB
AbstractGraph.class 5KB
AbstractGraph.class 5KB
AbstractGraph.class 5KB
Exercise_16_09.class 5KB
Exercise_16_14.class 5KB
BST.class 5KB
BST.class 5KB
BST.class 5KB
MyHashMap.class 5KB
BST.class 5KB
BST.class 5KB
MyHashMap.class 5KB
Exercise_16_16.class 5KB
MyHashMap.class 5KB
MyHashMap.class 4KB
Exercise_15_20.class 4KB
Exercise_20_03.class 4KB
BST.class 4KB
MyHashMap.class 4KB
Exercise_16_23.class 4KB
Exercise31_01Client.class 4KB
BST.class 4KB
Exercise31_05Client.class 4KB
ClockPane.class 4KB
Exercise31_03Client.class 4KB
Exercise_16_07.class 4KB
Exercise_16_02.class 4KB
FanPane.class 4KB
Exercise_20_02.class 4KB
Exercise_20_05$MultipleBallPane.class 4KB
FanPane.class 4KB
Exercise31_02Server.class 4KB
Exercise_16_01.class 4KB
Exercise_23_03.class 4KB
Exercise_16_15.class 4KB
Exercise_08_37.class 4KB
Exercise_16_25.class 4KB
Exercise_16_06.class 4KB
MyLinkedList.class 4KB
Exercise_23_02.class 4KB
Exercise31_06Server$HandleAClient.class 4KB
Exercise31_02Client.class 4KB
共 2009 条
- 1
- 2
- 3
- 4
- 5
- 6
- 21
资源评论
S40D1
- 粉丝: 32
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功