用JUnit或本身编写驱动类对本身实现的LinkedBinaryTree进行测试html
1.基于LinkedBinaryTree,实现基于(中序,先序)序列构造惟一一棵二㕚树的功能,java
2.给出中序HDIBEMJNAFCKGL和后序ABDHIEJMNCFGKL,构造出附图中的树
node
3.用JUnit或本身编写驱动类对本身实现的功能进行测试git
//为树的中序遍历返回一个迭代器 public Iterator<T> iteratorInOrder() { ArrayUnorderedList<T> tempList = new ArrayUnorderedList<T>(); inOrder(root, tempList); return new TreeIterator(tempList.iterator()); } protected void inOrder(BinaryTreeNode<T> node, ArrayUnorderedList<T> tempList) { if (node != null) { inOrder(node.getLeft(), tempList); tempList.addToRear(node.getElement()); inOrder(node.getRight(), tempList); } }
//为树的前序遍历返回一个迭代器 public Iterator<T> iteratorPreOrder() { ArrayUnorderedList<T> tempList = new ArrayUnorderedList<T>(); preOrder(root, tempList); return new TreeIterator(tempList.iterator()); } private void preOrder(BinaryTreeNode<T> node, ArrayUnorderedList<T> tempList) { if (node != null) { tempList.addToRear(node.getElement()); inOrder(node.getLeft(), tempList); inOrder(node.getRight(), tempList); } } @Override //为树的后序遍历返回一个迭代器 public Iterator<T> iteratorPostOrder() { ArrayUnorderedList<T> tempList = new ArrayUnorderedList<T>(); postOrder(root, tempList); return new TreeIterator(tempList.iterator()); } private void postOrder(BinaryTreeNode<T> node, ArrayUnorderedList<T> tempList) { if (node != null) { inOrder(node.getLeft(), tempList); inOrder(node.getRight(), tempList); tempList.addToRear(node.getElement()); } }
实现告终点类以后,对应地去实现方法类 LinkedBinaryTree,方法类中须要补充的函数有:getRight,contains,isEmpty,toString,preorder,postorder.数组
//返回结点的左侧子结点 public LinkedBinaryTree<T> getLeft() { return left; } //返回结点的右侧子结点 public LinkedBinaryTree<T> getRight() { return right; }
public boolean contains(T target) { BTNode<T> node = null; boolean result = true; if(root != null) node = root.find(target); if(node == null) result = false; return result; }
//判断树是否为空 @Override public boolean isEmpty() { return (root == null); }
//打印树 @Override public String toString(){ UnorderedListADT<BinaryTreeNode<T>> nodes = new ArrayUnorderedList<BinaryTreeNode<T>>(); UnorderedListADT<Integer> levelList = new ArrayUnorderedList<Integer>(); BinaryTreeNode<T> current; String result = ""; int printDepth = this.getHeight(); int possibleNodes = (int) Math.pow(2, printDepth + 1); int countNodes = 0; nodes.addToRear(root); Integer currentLevel = 0; Integer previousLevel = -1; levelList.addToRear(currentLevel); while (countNodes < possibleNodes) { countNodes = countNodes + 1; current = nodes.removeFirst(); currentLevel = levelList.removeFirst(); if (currentLevel > previousLevel) { result = result + "\n\n"; previousLevel = currentLevel; for (int j = 0; j < ((Math.pow(2, (printDepth - currentLevel))) - 1); j++) result = result + " "; } else { for (int i = 0; i < ((Math.pow(2, (printDepth - currentLevel + 1)) - 1)); i++) { result = result + " "; } } if (current != null) { result = result + (current.getElement()).toString(); nodes.addToRear(current.getLeft()); levelList.addToRear(currentLevel + 1); nodes.addToRear(current.getRight()); levelList.addToRear(currentLevel + 1); } else { nodes.addToRear(null); levelList.addToRear(currentLevel + 1); nodes.addToRear(null); levelList.addToRear(currentLevel + 1); result = result + " "; } } return result; }
@Override //为树的前序遍历返回一个迭代器 public Iterator<T> iteratorPreOrder() { ArrayUnorderedList<T> tempList = new ArrayUnorderedList<T>(); preOrder(root, tempList); return new TreeIterator(tempList.iterator()); } private void preOrder(BinaryTreeNode<T> node, ArrayUnorderedList<T> tempList) { if (node != null) { tempList.addToRear(node.getElement()); inOrder(node.getLeft(), tempList); inOrder(node.getRight(), tempList); } } @Override //为树的后序遍历返回一个迭代器 public Iterator<T> iteratorPostOrder() { ArrayUnorderedList<T> tempList = new ArrayUnorderedList<T>(); postOrder(root, tempList); return new TreeIterator(tempList.iterator()); } private void postOrder(BinaryTreeNode<T> node, ArrayUnorderedList<T> tempList) { if (node != null) { inOrder(node.getLeft(), tempList); inOrder(node.getRight(), tempList); tempList.addToRear(node.getElement()); } }
连接数据结构
连接框架
连接ide
public class Original extends LinkedBinaryTree{ public BinaryTreeNode creatTree(String str){ StringTokenizer tokenizer = new StringTokenizer(str); String token; ArrayList<String> operList = new ArrayList<>(); ArrayList<LinkedBinaryTree> numList = new ArrayList<>(); while (tokenizer.hasMoreTokens()){ token = tokenizer.nextToken(); if(token.equals("(")){ String str1 = ""; while (true){ token = tokenizer.nextToken(); if (!token.equals(")")) str1 += token + " "; else break; } LinkedBinaryTree S = new LinkedBinaryTree(); S.root = creatTree(str1); numList.add(S); } if(as(token)){ operList.add(token); }else if(md(token)){ LinkedBinaryTree left = numList.remove(numList.size()-1); String A = token; token = tokenizer.nextToken(); if(!token.equals("(")) { LinkedBinaryTree right = new LinkedBinaryTree(token); LinkedBinaryTree node = new LinkedBinaryTree(A, left, right); numList.add(node); }else { String str1 = ""; while (true){ token = tokenizer.nextToken(); if (!token.equals(")")) str1 += token + " "; else break; } LinkedBinaryTree S = new LinkedBinaryTree(); S.root = creatTree(str1); LinkedBinaryTree node = new LinkedBinaryTree(A,left,S); numList.add(node); } }else numList.add(new LinkedBinaryTree(token)); } while(operList.size()>0){ LinkedBinaryTree left = numList.remove(0); LinkedBinaryTree right = numList.remove(0); String oper = operList.remove(0); LinkedBinaryTree node = new LinkedBinaryTree(oper,left,right); numList.add(0,node); } root = (numList.get(0)).root; return root; } private boolean as(String token){ return (token.equals("+")|| token.equals("-")); } private boolean md(String token){ return (token.equals("*")|| token.equals("/")); } public String Output(){ String result = ""; ArrayList<String> list = new ArrayList<>(); root.postorder(list); for(String i : list){ result += i+" "; } return result; } }
连接函数
//返回二进制搜索中最小值的元素树.它不会从二进制搜索树中删除该节点。若是此树为空, 则抛出 EmptyCollectionException。 // @return 最小值的元素 // @throws EmptyCollectionException 若是树是空的 public T findMin() throws EmptyCollectionException { T result = null; if (isEmpty()) throw new EmptyCollectionException("LinkedBinarySearchTree"); else { if (root.left == null) { result = root.element; //root = root.right; } else { BinaryTreeNode<T> parent = root; BinaryTreeNode<T> current = root.left; while (current.left != null) { parent = current; current = current.left; } result = current.element; //parent.left = current.right; } //modCount--; } return result; } //返回在二进制文件中具备最高值的元素搜索树。 它不会从二进制文件中删除节点搜索树。 若是此树为空, 则抛出 EmptyCollectionException。 // @return 具备最高值的元素 // @throws EmptyCollectionException 若是树是空的 public T findMax() throws EmptyCollectionException { T result = null; if (isEmpty()) throw new EmptyCollectionException("LinkedBinarySearchTree"); else { if (root.right == null) { result = root.element; //root = root.left; } else { BinaryTreeNode<T> parent = root; BinaryTreeNode<T> current = root.right; while (current.right != null) { parent = current; current = current.right; } result = current.element; //parent.right = current.left; } //modCount--; } return result; }
连接源码分析
红黑树示意图:
public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, java.io.Serializable ---------------------------------------------------------------- //TreeMap 是一个有序的key-value集合,它是经过红黑树实现的。 //TreeMap 继承于AbstractMap,因此它是一个Map,即一个key-value集合。 //TreeMap 实现了NavigableMap接口,意味着它支持一系列的导航方法。好比返回有序的key集合。 //TreeMap 实现了Cloneable接口,意味着它能被克隆。 //TreeMap 实现了java.io.Serializable接口,意味着它支持序列化。
public Map.Entry<K,V> firstEntry() { return exportEntry(getFirstEntry()); } final Entry<K,V> getFirstEntry() { Entry<K,V> p = root; if (p != null) while (p.left != null) p = p.left; return p; }
firstEntry() 和 getFirstEntry() 都是用于获取第一个节点。firstEntry() 是对外接口;getFirstEntry() 是内部接口。并且,firstEntry() 是经过 getFirstEntry() 来实现的。
public HashMap(int initialCapacity, float loadFactor)
初始容量默认值:
/** * The default initial capacity - MUST be a power of two. */ static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
加载因子默认值:
/** * The load factor used when none specified in constructor. */ static final float DEFAULT_LOAD_FACTOR = 0.75f;
public boolean containsValue(Object value) { Node<K,V>[] tab; V v; if ((tab = table) != null && size > 0) { for (int i = 0; i < tab.length; ++i) { for (Node<K,V> e = tab[i]; e != null; e = e.next) { if ((v = e.value) == value || (value != null && value.equals(v))) return true; } } } return false; }
若是在map中包含对应的特定的键值则返回true,不然返回false。
问题出现了好多,但我都解决了,忘截图了,因此这地我也不知道写点啥。
经过此次实验,我发现我对这段时间树的学习并部扎实,有些基本的仍是记不住,在逻辑推理的过程当中,遇到的麻烦也比较多。此次实验让我知道了,最近的不足,也让我决定抽出更多时间去学习Java。