提示:求一颗二叉搜索树的高度
给一个BST求其高度
提示:这里直接递归就好
递归的思路是每次把当前节点当成子树,求其左分支和右分支的最大高度,就这样递归下去,得到其子树的累加和,最后的左子树和右子树中累加和最高的就是BST的高度
提示:这里也可以用栈或者线性表来替代一下
import java.util.*;
public class Lab25_01 {
public static void main(String[] args) {
BSTWithHeight tree = new BSTWithHeight<>();
System.out.print("The height of an empty tree is " + tree.height());
tree.insert("Green");
System.out.print("\nThe height of the tree with one node is " + tree.height());
tree.insert("Red");
System.out.print("\nThe height of the tree with two nodes is " + tree.height());
Scanner input = new Scanner(System.in);
System.out.print("\nEnter six strings: ");
for (int i = 0; i < 6; i++) {
String s = input.next();
tree.insert(s.trim());
}
System.out.print("The height of tree is " + tree.height());
BSTWithHeight tree1 = new BSTWithHeight<>(new String[]
{"Tom", "George", "Jean", "Jane", "Kevin", "Peter", "Susan",
"Jen", "Kim", "Michael", "Michelle"});
System.out.print("\nThe height of tree1 is " + tree1.height());
BSTWithHeight tree2 =
new BSTWithHeight<>(new Integer[]{50, 45, 35, 48, 59, 51, 58});
// BSTWithHeight tree2 =
// new BSTWithHeight<>(new Integer[]{50, 45, 59, 35, 48, 47, 46});
int temp = tree2.height();
System.out.print("\nThe height of tree2 is " + temp);
}
}
interface Tree extends Collection {
/**
* Return true if the element is in the tree
*/
public boolean search(E e);
/**
* Insert element o into the binary tree
* Return true if the element is inserted successfully
*/
public boolean insert(E e);
/**
* Delete the specified element from the tree
* Return true if the element is deleted successfully
*/
public boolean delete(E e);
/**
* Get the number of nodes in the tree
*/
public int getSize();
/**
* Inorder traversal from the root
*/
public default void inorder() {
}
/**
* Postorder traversal from the root
*/
public default void postorder() {
}
/**
* Preorder traversal from the root
*/
public default void preorder() {
}
@Override
/** Return true if the tree is empty */
public default boolean isEmpty() {
return size() == 0;
}
;
@Override
public default boolean contains(Object e) {
return search((E) e);
}
@Override
public default boolean add(E e) {
return insert(e);
}
@Override
public default boolean remove(Object e) {
return delete((E) e);
}
@Override
public default int size() {
return getSize();
}
@Override
public default boolean containsAll(Collection> c) {
// Left as an exercise
return false;
}
@Override
public default boolean addAll(Collection extends E> c) {
// Left as an exercise
return false;
}
@Override
public default boolean removeAll(Collection> c) {
// Left as an exercise
return false;
}
@Override
public default boolean retainAll(Collection> c) {
// Left as an exercise
return false;
}
@Override
public default Object[] toArray() {
// Left as an exercise
return null;
}
@Override
public default T[] toArray(T[] array) {
// Left as an exercise
return null;
}
}
class BST implements Tree25_02 {
protected TreeNode root;
protected int size = 0;
protected Comparator c;
/**
* Create a default BST with a natural order comparator
*/
public BST() {
this.c = new Comparator() {
public int compare(E e1, E e2) {
return ((Comparable) e1).compareTo(e2);
}
};
}
/**
* Create a BST with a specified comparator
*/
public BST(Comparator c) {
this.c = c;
}
/**
* Create a binary tree from an array of objects
*/
public BST(E[] objects) {
this();
for (int i = 0; i < objects.length; i++)
add(objects[i]);
}
@Override
/** Returns true if the element is in the tree */
public boolean search(E e) {
TreeNode current = root; // Start from the root
while (current != null) {
if (c.compare(e, current.element) < 0) {
current = current.left;
} else if (c.compare(e, current.element) > 0) {
current = current.right;
} else // element matches current.element
return true; // Element is found
}
return false;
}
@Override
/** Insert element e into the binary tree
* Return true if the element is inserted successfully */
public boolean insert(E e) {
if (root == null)
root = createNewNode(e); // Create a new root
else {
// Locate the parent node
TreeNode parent = null;
TreeNode current = root;
while (current != null)
if (c.compare(e, current.element) < 0) {
parent = current;
current = current.left;
} else if (c.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 node
if (c.compare(e, parent.element) < 0)
parent.left = createNewNode(e);
else
parent.right = createNewNode(e);
}
size++;
return true; // Element inserted successfully
}
protected TreeNode 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 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 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 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 {
protected E element;
protected TreeNode left;
protected TreeNode 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 getRoot() {
return root;
}
/**
* Returns a path from the root leading to the specified element
*/
public ArrayList> path(E e) {
ArrayList> list =
new ArrayList<>();
TreeNode current = root; // Start from the root
while (current != null) {
list.add(current); // Add the node to the list
if (c.compare(e, current.element) < 0) {
current = current.left;
} else if (c.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 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 parent = null;
TreeNode current = root;
while (current != null) {
if (c.compare(e, current.element) < 0) {
parent = current;
current = current.left;
} else if (c.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 (c.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 and also its parent
TreeNode parentOfRightMost = current;
TreeNode 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--; // Reduce the size of the tree
return true; // Element deleted successfully
}
@Override
/** Obtain an iterator. Use inorder. */
public Iterator iterator() {
return new InorderIterator();
}
// Inner class InorderIterator
private class InorderIterator implements Iterator {
// Store the elements in a list
private ArrayList list =
new 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 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 element returned by the last next()
public void remove() {
if (current == 0) // next() has not been called yet
throw new IllegalStateException();
delete(list.get(--current));
list.clear(); // Clear the list
inorder(); // Rebuild the list
}
}
@Override
/** Remove all elements from the tree */
public void clear() {
root = null;
size = 0;
}
}
// BEGIN REVEL SUBMISSION
class BSTWithHeight extends BST25_15 {
/**
* Create a default BST with a natural order comparator
*/
public BSTWithHeight() {
super();
}
/**
* Create a BST with a specified comparator
*/
public BSTWithHeight(Comparator c) {
super(c);
}
/**
* Create a binary tree from an array of objects
*/
public BSTWithHeight(E[] objects) {
super(objects);
}
/**
* Returns the height of this binary tree.
*/
public int height() {
return height(root);
}
private int height(TreeNode root) {
// WRITE YOUR CODE HERE
if (root == null) return -1;
return Math.max(height(root.left), height(root.right)) + 1;
}
}
// END REVEL SUBMISSION