LinkedBinarySearchTree<T> result = new LinkedBinarySearchTree<>(); result.root = root.getRight(); return result;
contains方法爲判斷是否存在目標元素,經過結合find方法,find方法是返回一個boolean值,在此基礎上,將找到的結點的元素值返回便可。部分關鍵代碼以下:html
public boolean contains(T targetElement) { if(find(targetElement)!=null) return true; else return false; } public T find(T targetElement) throws ElementNotFoundException { BinaryTreeNode<T> current = findNode(targetElement, root); if (current == null) throw new ElementNotFoundException("LinkedBinaryTree"); return (current.getElement()); } 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; }
public Iterator<T> iteratorPostOrder() { ArrayUnorderedList<T> tempList = new ArrayUnorderedList<T>(); postOrder(root,tempList); return new TreeIterator(tempList.iterator()); } protected void postOrder(BinaryTreeNode<T> node, ArrayUnorderedList<T> tempList) { if (node !=null){ postOrder(node.getLeft(),tempList); postOrder(node.getRight(),tempList); tempList.addToRear(node.getElement()); } }
public BinaryTreeNode initTree(String[] preorder, int s1, int e1, String[] inorder, int s2, int e2) {//s1是前序開始值,e1是結束值 if (s1 > e1 || s2 > e2) { return null; } String rootE = preorder[s1];//前序定根 BinaryTreeNode head = new BinaryTreeNode(rootE); int rootG = findRoot(inorder, rootE, s2, e2);//在中序中找到根的位置 BinaryTreeNode left = initTree(preorder, s1 + 1, s1 + rootG - s2, inorder, s2, rootG - 1);//開始使用遞歸,經過根的索引值肯定數組中各個子樹的位置,將其分割 BinaryTreeNode right = initTree(preorder, s1 + rootG - s2 + 1, e1, inorder, rootG + 1, e2); head.setLeft(left); head.setRight(right); return head; }
public void evaluate() { LinkedBinaryTree<String> current = tree; Scanner scan = new Scanner(System.in); while (current.size() > 1) { System.out.println (current.getRootElement()); if (scan.nextLine().equalsIgnoreCase("N")) current = current.getRight(); else current = current.getLeft(); } System.out.println (current.getRootElement()); }
if(isOp(temp)&&isHighOp(temp)){//有高級符號 BinaryTreeNode current = new BinaryTreeNode(temp); current.setLeft(numlist.remove(numlist.size()-1)); num2 = scan.nextToken(); current.setRight(new BinaryTreeNode(num2)); numlist.add(current); }
public T removeMin() 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--; }
TreeMap 是一個有序的key-value集合,它是經過紅黑樹實現的。
TreeMap 繼承於AbstractMap,因此它是一個Map,即一個key-value集合。
TreeMap 實現了NavigableMap接口,意味着它支持一系列的導航方法。好比返回有序的key集合。
TreeMap 實現了Cloneable接口,意味着它能被克隆。
TreeMap 實現了java.io.Serializable接口,意味着它支持序列化。
TreeMap基於紅黑樹(Red-Black tree)實現。該映射根據其鍵的天然順序進行排序,或者根據建立映射時提供的 Comparator 進行排序,具體取決於使用的構造方法。
TreeMap的基本操做 containsKey、get、put 和 remove 的時間複雜度是 log(n) 。
另外,TreeMap是非同步的。 它的iterator 方法返回的迭代器是fail-fastl的。java
// 根據已經一個排好序的map建立一個TreeMap // 將map中的元素逐個添加到TreeMap中,並返回map的中間元素做爲根節點。 private final Entry<K,V> buildFromSorted(int level, int lo, int hi, int redLevel, Iterator it, java.io.ObjectInputStream str, V defaultVal) throws java.io.IOException, ClassNotFoundException { if (hi < lo) return null; // 獲取中間元素 int mid = (lo + hi) / 2; Entry<K,V> left = null; // 若lo小於mid,則遞歸調用獲取(middel的)左孩子。 if (lo < mid) left = buildFromSorted(level+1, lo, mid - 1, redLevel, it, str, defaultVal); // 獲取middle節點對應的key和value K key; V value; if (it != null) { if (defaultVal==null) { Map.Entry<K,V> entry = (Map.Entry<K,V>)it.next(); key = entry.getKey(); value = entry.getValue(); } else { key = (K)it.next(); value = defaultVal; } } else { // use stream key = (K) str.readObject(); value = (defaultVal != null ? defaultVal : (V) str.readObject()); } // 建立middle節點 Entry<K,V> middle = new Entry<K,V>(key, value, null); // 若當前節點的深度=紅色節點的深度,則將節點着色爲紅色。 if (level == redLevel) middle.color = RED; // 設置middle爲left的父親,left爲middle的左孩子 if (left != null) { middle.left = left; left.parent = middle; } if (mid < hi) { // 遞歸調用獲取(middel的)右孩子。 Entry<K,V> right = buildFromSorted(level+1, mid+1, hi, redLevel, it, str, defaultVal); // 設置middle爲left的父親,left爲middle的左孩子 middle.right = right; right.parent = middle; } return middle; }
TreeMap的put操做 TreeMap在進行put操做時,主要有如下步驟: (1)判斷樹是不是空的,若是是空的,直接將當前插入的k-v當作是根節點,完成了插入操做; (2)若是樹不是空的,獲取比較器(不論是自定義的比較器仍是默認的比較器),對樹從根節點開始遍歷, (3)若是k小於結點的key,那麼開始遍歷左子節點,若是大於結點的key,開始遍歷右子節點,若是相等,說明k已經在TreeMap中存在了,就用新的value值覆蓋舊的value值,完成了插入操做; (4)若是k在TreeMap中不存在,將k插入到其相應的位置,此時因爲樹的結構進行了變化,須要檢驗其是否知足紅黑性的元素,調用fixAfterInsertion方法。node
public V get(Object key) { if (key == null) return getForNullKey(); int hash = hash(key.hashCode()); for (Entry<K,V> e = table[indexFor(hash, table.length)]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) return e.value; } return null; } private V getForNullKey() { for (Entry<K,V> e = table[0]; e != null; e = e.next) { if (e.key == null) return e.value; } return null; }
在用Scanner方法時,它是用從後往前的順序進行掃描的,注意這張圖,右邊比左邊多了一行,並且是空白的一行。咱們先看一下nextLine的方法數組
- nextLine
public String nextLine()此掃描器執行當前行,並返回跳過的輸入信息。 此方法返回當前行的其他部分,不包括結尾處的行分隔符。當前位置移至下一行的行首。
由於此方法會繼續在輸入信息中查找行分隔符,因此若是沒有行分隔符,它可能會緩衝全部輸入信息,並查找要跳過的行。
返回:
跳過的行
拋出:
NoSuchElementException - 若是未找到這樣的行
IllegalStateException - 若是此掃描器已關閉
public void postfix(){ LinkedBinaryTree lbt = new LinkedBinaryTree(); lbt.root = btnode2; Iterator it = lbt.iteratorPostOrder(); while(it.hasNext()) System.out.print(it.next().toString()+" "); }
問題代碼,如今每次都將其實例化,可是卻並無獲得存儲,隨着這個方法的每一次調用,都產生了一個新的樹,致使出現了空。安全