用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。