实验步骤:html
public LinkedBinaryTree<T> getRight() { if (root == null) throw new EmptyCollectionException("Get right operation " + "failed. The tree is empty."); LinkedBinaryTree<T> result = new LinkedBinaryTree<T>(); result.root = root.getRight(); return result; } public boolean contains (T target) { if (root.find(target) != null) return true; else return false; } public String toString() { ArrayIterator<T> lxr=new ArrayIterator(); lxr= (ArrayIterator<T>) levelorder();//强制转化 String content=""; for (T i: lxr){//临时引用lxr的每个元素 content += i +" "; } return content; } public Iterator<T> preorder() { ArrayIterator<T> iter = new ArrayIterator <>(); if (root != null) root.preorder(iter); return iter; } public Iterator<T> postorder() { ArrayIterator<T> iter = new ArrayIterator<T>(); if(root!=null){ root.postorder (iter); } return iter;} public boolean isEmpty() { if (root.count() != 0) return false; else return true; }
getLeft()
套用补全getRight()
find
方法,该方法最后会返回查找的元素,则使用find查找target目标元素,根据查找结果返回true或falsetoString
方法有些复杂,由于最后打印的结果要一目了然,知道树的轮廓,因此我选择使用levelorder()
层序遍从来打印。将树中的元素进行层序遍历,建立T创建for循环临时引用树中的每个元素并将其加入一个String的变量上,最后返回它。最后测试,创建一个树如图,获得打印结果1 2 3 4 5
代码连接
参考连接:我参考了这位博主的博客根据先序和中序遍历重建二叉树java实现,依葫芦画瓢完成实验
实验步骤:java
代码连接
实验步骤:git
public void Asking() { Scanner scan = new Scanner(System.in); System.out.println("猜人游戏,你只能回答“是”或“否”,这里有若干我的可供你选择:刘先润,李一桐,张靓颖,杨幂,艾玛沃特森,卢本伟,马军,刘伟康"); while(NewTree.size()>0){ System.out.println(NewTree.getRootElement()); String a=scan.nextLine(); if (a.equalsIgnoreCase("否")){ if(NewTree.getRight()!=null) { NewTree = NewTree.getRight(); }else { break; } } else { if(NewTree.getLeft()!=null) { NewTree = NewTree.getLeft(); }else { break; } }
代码连接
实验步骤:算法
1 + 6 * 9 -8 / 2
,将其构建进这个树中,可知创建的形状以下图所示代码连接
实验步骤:数组
public T findMin() { if (root == null) { return null; } if (root!=null && root.getLeft()==null) { return root.getElement(); } while (root.getLeft() != null) { root = root.getLeft(); if (root.getLeft()==null) { break; } }return root.getElement(); }
首先我须要了解红黑树的概念,何为红黑树?它是一种特殊的二叉查找树。红黑树的每一个节点上都有存储位表示节点的颜色。根结点是黑色,结点颜色与子结点颜色不一样。主要是用它来存储有序的数据,它的时间复杂度是O(lgn),效率很是之高。附上参考资料连接:红黑树(一)之 原理和算法详细介绍、HashMap详细介绍
而后分析TreeMap,它是基于红黑树的 NavigableMap 实现。该映射根据其键的天然顺序进行排序,或者根据建立映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。 TreeMap存储的是key-value键值对,TreeMap的排序是基于对key的排序,它本质上就是一个红黑树。它内部有 Comparator用来给TreeMap排序,带有Map和SortMap的构造函数会成为TreeMap的子集。
分析具体的方法get,获取键key对应的值value,首先要获取key键的节点p,若节点p不为null,返回节点对应的值。app
public V get(Object key) { Entry<K,V> p = getEntry(key); return (p==null ? null : p.value); }
分析putAll方法,它的做用是将map中的所有节点添加到TreeMap中。首先获取map的大小,若是TreeMap的大小是0,且map的大小不是0,且map是已排序的“key-value对”,若是TreeMap和Map的comparator相等,则将map的元素所有拷贝到TreeNap中,而后返回。最后调用AbstractMap中的putAll(),而putAll()又会调用TreeMap的put()。函数
public void putAll(Map<? extends K, ? extends V> map) { int mapSize = map.size(); if (size==0 && mapSize!=0 && map instanceof SortedMap) { Comparator c = ((SortedMap)map).comparator(); if (c == comparator || (c != null && c.equals(comparator))) { ++modCount; try { buildFromSorted(mapSize, map.entrySet().iterator(), null, null); } catch (java.io.IOException cannotHappen) { } catch (ClassNotFoundException cannotHappen) { } return; } } super.putAll(map); }
对TreeMap有一个初步了解后再分析HashMap,经过查阅JDK文件得知,HashMap是基于哈希表的 Map 接口的实现。此实现提供全部可选的映射操做,并容许使用 null 值和 null 键。HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。HashMap有两个重要参数,它存在一个容量(哈希表中桶的数量)和一个加载因子(容量自动增长以前能够达到多满的一种尺度)
接着分析源码,HashMap中的key-value都是存储在Entry数组中的。它有4个构造函数,例以下列代码,这是一个默认的构造函数,它首先设置加载因子,而后设置“HashMap阈值”,当HashMap中存储的量达到threshold时,就将HashMap的容量加倍。最后建立Entry数组保存数据。源码分析
public HashMap() { this.loadFactor = DEFAULT_LOAD_FACTOR; threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR); table = new Entry[DEFAULT_INITIAL_CAPACITY]; init(); }
再分析一个方法get(),返回指定键所映射的值;若是对于该键来讲,此映射不包含任何映射关系,则返回 null。它首先会获取key的hash值,在该hash值对应的链表上查找键值为key的元素。post
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; }
经过本次源码分析对TreeMap和HashMap有了更深的了解,它的方法实现思路很是值得像我这样的新手学习借鉴。学习