2 Star 0 Fork 0

CS-IMIS-23/why20172321

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
LinkedBinaryTree.java 14.37 KB
一键复制 编辑 原始数据 按行查看 历史
package week7;
import java.util.*;
import week5.ArrayUnorderedList;
import week7.书上代码.jsjf.BinaryTreeADT;
import week7.书上代码.jsjf.exceptions.*;
/**
* LinkedBinaryTree implements the BinaryTreeADT interface
*
* @author Lewis and Chase
* @version 4.0
*/
public class LinkedBinaryTree<T> implements BinaryTreeADT<T>, Iterable<T> {
protected BinaryTreeNode<T> root;
protected int modCount;
/**
* Creates an empty binary tree.
*/
public LinkedBinaryTree() {
root = null;
}
/**
* Creates a binary tree with the specified element as its root.
*
* @param element the element that will become the root of the binary tree
*/
public LinkedBinaryTree(T element) {
root = new BinaryTreeNode<T>(element);
}
/**
* Creates a binary tree with the specified element as its root and the
* given trees as its left child and right child
*
* @param element the element that will become the root of the binary tree
* @param left the left subtree of this tree
* @param right the right subtree of this tree
*/
public LinkedBinaryTree(T element, LinkedBinaryTree<T> left,
LinkedBinaryTree<T> right) {
root = new BinaryTreeNode<T>(element);
root.setLeft(left.root);
root.setRight(right.root);
}
/**
* Returns a reference to the element at the root
*
* @return a reference to the specified target
* @throws EmptyCollectionException if the tree is empty
*/
@Override
public T getRootElement() throws EmptyCollectionException {
// To be completed as a Programming Project
return root.element;
}
/**
* Returns a reference to the node at the root
*
* @return a reference to the specified node
* @throws EmptyCollectionException if the tree is empty
*/
protected BinaryTreeNode<T> getRootNode() throws EmptyCollectionException {
// To be completed as a Programming Project
return root;
}
/**
* Returns the left subtree of the root of this tree.
*
* @return a link to the left subtree fo the tree
*/
public LinkedBinaryTree<T> getLeft() {
// To be completed as a Programming Project
return new LinkedBinaryTree(root.getLeft());
}
/**
* Returns the right subtree of the root of this tree.
*
* @return a link to the right subtree of the tree
*/
public LinkedBinaryTree<T> getRight() {
// LinkedBinaryTree node = new LinkedBinaryTree();
// node.root=root.getRight();
return new LinkedBinaryTree(root.getRight());
}
/**
* Returns true if this binary tree is empty and false otherwise.
*
* @return true if this binary tree is empty, false otherwise
*/
@Override
public boolean isEmpty() {
return (root == null);
}
/**
* Returns the integer size of this tree.
*
* @return the integer size of the tree
*/
@Override
public int size() {
return size(root) + 1;
}
public int size(BinaryTreeNode node) {
ArrayUnorderedList<T> tempList = new ArrayUnorderedList<>();
if (root != null) {
inOrder(root.getLeft(), tempList);
inOrder(root.getRight(), tempList);
}
return tempList.size();
}
/**
* Returns the height of this tree.
*
* @return the height of the tree
*/
public int getHeight() {
// To be completed as a Programming Project
return height(root);
}
/**
* Returns the height of the specified node.
*
* @param node the node from which to calculate the height
* @return the height of the tree
*/
private int height(BinaryTreeNode<T> node) {
if (node == null) {
return 0;
} else {
int i = height(node.getLeft());
int j = height(node.getRight());
return (i < j) ? (j + 1) : (i + 1);
}
}
/**
* Returns true if this tree contains an element that matches the
* specified target element and false otherwise.
*
* @param targetElement the element being sought in this tree
* @return true if the element in is this tree, false otherwise
*/
@Override
public boolean contains(T targetElement) {
if (find(targetElement) == targetElement) {
return true;
} else {
return false;
}
}
/**
* Returns a reference to the specified target element if it is
* found in this binary tree. Throws a ElementNotFoundException if
* the specified target element is not found in the binary tree.
*
* @param targetElement the element being sought in this tree
* @return a reference to the specified target
* @throws ElementNotFoundException if the element is not in the tree
*/
@Override
public T find(T targetElement) throws ElementNotFoundException {
BinaryTreeNode<T> current = findNode(targetElement, root);
if (current == null)
throw new ElementNotFoundException("LinkedBinaryTree");
return (current.getElement());
}
/**
* Returns a reference to the specified target element if it is
* found in this binary tree.
*
* @param targetElement the element being sought in this tree
* @param next the element to begin searching from
*/
private BinaryTreeNode<T> findNode(T targetElement,
BinaryTreeNode<T> next) {
if (next == null)
return null;
if (next.getElement().equals(targetElement))
return next;
BinaryTreeNode<T> temp = findNode(targetElement, next.getLeft());
if (temp == null)
temp = findNode(targetElement, next.getRight());
return temp;
}
/**
* Returns a string representation of this binary tree showing
* the nodes in an inorder fashion.
*
* @return a string representation of this binary tree
*/
@Override
public String toString() {
ArrayUnorderedList<T> tempList = new ArrayUnorderedList<>();
if (root != null) {
inOrder(root.getLeft(), tempList);
inOrder(root.getRight(), tempList);
}
return tempList.toString();
}
/**
* Returns an iterator over the elements in this tree using the
* iteratorInOrder method
*
* @return an in order iterator over this binary tree
*/
@Override
public Iterator<T> iterator() {
return iteratorInOrder();
}
/**
* Performs an inorder traversal on this binary tree by calling an
* overloaded, recursive inorder method that starts with
* the root.
*
* @return an in order iterator over this binary tree
*/
@Override
public Iterator<T> iteratorInOrder() {
ArrayUnorderedList<T> tempList = new ArrayUnorderedList<T>();
inOrder(root, tempList);
return new TreeIterator(tempList.iterator());
}
/**
* Performs a recursive inorder traversal.
*
* @param node the node to be used as the root for this traversal
* @param tempList the temporary list for use in this traversal
*/
protected void inOrder(BinaryTreeNode<T> node,
ArrayUnorderedList<T> tempList) {
if (node != null) {
inOrder(node.getLeft(), tempList);
tempList.addToRear(node.getElement());
inOrder(node.getRight(), tempList);
}
}
/**
* Performs an preorder traversal on this binary tree by calling
* an overloaded, recursive preorder method that starts with
* the root.
*
* @return a pre order iterator over this tree
*/
@Override
public Iterator<T> iteratorPreOrder() {
ArrayUnorderedList<T> tempList = new ArrayUnorderedList<T>();
preOrder(root, tempList);
return new TreeIterator(tempList.iterator());
}
/**
* Performs a recursive preorder traversal.
*
* @param node the node to be used as the root for this traversal
* @param tempList the temporary list for use in this traversal
*/
protected void preOrder(BinaryTreeNode<T> node,
ArrayUnorderedList<T> tempList) {
if (node != null) {
// System.out.print(node.getElement()+" ");
tempList.addToRear(node.getElement());
preOrder(node.getLeft(), tempList);
preOrder(node.getRight(), tempList);
}
}
/**
* Performs an postorder traversal on this binary tree by calling
* an overloaded, recursive postorder method that starts
* with the root.
*
* @return a post order iterator over this tree
*/
@Override
public Iterator<T> iteratorPostOrder() {
ArrayUnorderedList<T> tempList = new ArrayUnorderedList<T>();
postOrder(root, tempList);
return new TreeIterator(tempList.iterator());
}
/**
* Performs a recursive postorder traversal.
*
* @param node the node to be used as the root for this traversal
* @param tempList the temporary list for use in this traversal
*/
protected void postOrder(BinaryTreeNode<T> node,
ArrayUnorderedList<T> tempList) {
if (node != null) {
postOrder(node.getLeft(), tempList);
postOrder(node.getRight(), tempList);
tempList.addToRear(node.getElement());
}
}
/**
* Performs a levelorder traversal on this binary tree, using a
* templist.
*
* @return a levelorder iterator over this binary tree
*/
@Override
public Iterator<T> iteratorLevelOrder() {
ArrayUnorderedList<BinaryTreeNode<T>> nodes =
new ArrayUnorderedList<BinaryTreeNode<T>>();
ArrayUnorderedList<T> tempList = new ArrayUnorderedList<T>();
BinaryTreeNode<T> current;
nodes.addToRear(root);
while (!nodes.isEmpty()) {
current = nodes.removeFirst();
if (current != null) {
tempList.addToRear(current.getElement());
if (current.getLeft() != null)
nodes.addToRear(current.getLeft());
if (current.getRight() != null)
nodes.addToRear(current.getRight());
} else
tempList.addToRear(null);
}
return new TreeIterator(tempList.iterator());
}
/**
* Inner class to represent an iterator over the elements of this tree
*/
private class TreeIterator implements Iterator<T> {
private int expectedModCount;
private Iterator<T> iter;
/**
* Sets up this iterator using the specified iterator.
*
* @param iter the list iterator created by a tree traversal
*/
public TreeIterator(Iterator<T> iter) {
this.iter = iter;
expectedModCount = modCount;
}
/**
* Returns true if this iterator has at least one more element
* to deliver in the iteration.
*
* @return true if this iterator has at least one more element to deliver
* in the iteration
* @throws ConcurrentModificationException if the collection has changed
* while the iterator is in use
*/
@Override
public boolean hasNext() throws ConcurrentModificationException {
if (!(modCount == expectedModCount))
throw new ConcurrentModificationException();
return (iter.hasNext());
}
/**
* Returns the next element in the iteration. If there are no
* more elements in this iteration, a NoSuchElementException is
* thrown.
*
* @return the next element in the iteration
* @throws NoSuchElementException if the iterator is empty
*/
@Override
public T next() throws NoSuchElementException {
if (hasNext())
return (iter.next());
else
throw new NoSuchElementException();
}
/**
* The remove operation is not supported.
*
* @throws UnsupportedOperationException if the remove operation is called
*/
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}
public String removeRightSubtree() throws EmptyCollectionException {
BinaryTreeNode cur = root;
while (cur.getLeft() != null) {
cur.setRight(null);
cur = cur.left;
}
return super.toString();
}
public String removeAllElements() throws EmptyCollectionException {
while (root.getLeft() != null) {
root.setRight(null);
root = root.left;
}
root = null;
return super.toString();
}
//利用递归实现层序遍历
public void levelOrder1(BinaryTreeNode<T> Node) {
if (Node == null) {
return;
}
int depth = height(root);
for (int a = 1; a <= depth; a++) {
levelOrder(Node, a);
}
}
private void levelOrder(BinaryTreeNode<T> Node, int level) {
if (Node == null || level < 1) {
return;
}
if (level == 1) {
System.out.print(Node.element + "\n");
return;
}
levelOrder(Node.left, level - 1);
levelOrder(Node.right, level - 1);
}
//利用非递归实现层序遍历
public void levelOrder2() {
if (root != null) {
//使用队列存储二叉树
LinkedList<BinaryTreeNode> queue = new LinkedList<>();
BinaryTreeNode<T> binaryTreeNode;
//根结点入队
queue.push(root);
while (!queue.isEmpty()) {
binaryTreeNode = queue.removeFirst();
System.out.println(binaryTreeNode.element);
//若该元素有左孩子,则使左孩子入队
if (binaryTreeNode.left != null)
queue.addLast(binaryTreeNode.left);
//若该元素有右孩子,则使右孩子入队
if (binaryTreeNode.right != null)
queue.addLast(binaryTreeNode.right);
}
} else
System.out.println("null");
}
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Java
1
https://gitee.com/CS-IMIS-23/why20172321.git
git@gitee.com:CS-IMIS-23/why20172321.git
CS-IMIS-23
why20172321
why20172321
master

搜索帮助