博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TreeMap put 操作分析
阅读量:4931 次
发布时间:2019-06-11

本文共 2656 字,大约阅读时间需要 8 分钟。

1 public V put(K key, V value) { 2         //t 表示当前节点,记住这个很重要!先把TreeMap 的根节点root 的引用赋值给当前节点 3         TreeMap.Entry
t = root; 4 //如果当前节点为null ,即是空树,新增的KV 形成的节点就是根节点 5 if (t == null) { 6 //看似多此一举,实际上预检了Key 是否 可以比较 7 compare(key, key); // type (and possibly null) check 8 // 使用Kv 构造出新的Entry 对象,其中第三个参数就是parent ,根节点没有父亲节点 9 root = new TreeMap.Entry<>(key, value, null);10 size = 1;11 modCount++;12 return null;13 }14 // cmp 用来接收比较结果15 int cmp;16 TreeMap.Entry
parent;17 // split comparator and comparable paths18 //构造方法中置入的外部比较器19 Comparator
cpr = comparator;20 // 重点步骤:根据二叉树的特性,找到新的节点插入的合适位置21 if (cpr != null) {22 //循环的目标:根据key 与当前节点key 不断地进行对比23 do {24 //当前节点赋值个父亲节点,故从根节点开始遍历比较25 parent = t;26 //比较输入的参数的key和当前节点Key 的大小27 cmp = cpr.compare(key, t.key);28 //参数的key 更小,向左边走,把当前节点引用移动至它的左子节点上29 if (cmp < 0)30 t = t.left;31 //参数的key 更大,向右边走,把当前节点引用移动至它的右子节点上32 else if (cmp > 0)33 t = t.right;34 //如果相等,则会残忍的覆盖当前节点的Value 值,并返回更新的前的值35 else36 return t.setValue(value);37 } while (t != null);38 }39 //在没有比较器的情况下,调用自然排序的Comparable 比较40 else {41 if (key == null)42 throw new NullPointerException();43 @SuppressWarnings("unchecked")44 Comparable
k = (Comparable
) key;45 do {46 parent = t;47 cmp = k.compareTo(t.key);48 if (cmp < 0)49 t = t.left;50 else if (cmp > 0)51 t = t.right;52 else53 return t.setValue(value);54 } while (t != null);55 }56 // 创建Entry 对象,并把parent 置入参数57 TreeMap.Entry
e = new TreeMap.Entry<>(key, value, parent);58 //新节点找到自己的位置,原本以为可以安顿下来----------59 if (cmp < 0)60 //如果比较结果小于0 ,则成为parent 的左孩子61 parent.left = e;62 else63 //如果比较结果大于0 ,则成为parent 的右孩子64 parent.right = e;65 //还需要重新对这个节点进行着色,旋转操作,已达到平衡66 fixAfterInsertion(e);67 size++;68 modCount++;69 //成功插入新节点后,返回null70 return null;71 }

 

转载于:https://www.cnblogs.com/WangJinYang/p/10331381.html

你可能感兴趣的文章
delphi 接口Interface
查看>>
弹性盒模型display:flex
查看>>
应用层常用协议
查看>>
iOS 7 UI 过渡指南 - 開始之前(iOS 7 UI Transition Guide - Before You Start)
查看>>
POJ2155:Matrix(二维树状数组,经典)
查看>>
JDK5什么是新的堵塞队列线程(四)
查看>>
怎样基于android4.4.2的源代码和android-4.3.1_r1的驱动编译I9250的ROM
查看>>
TCP和UDP协议的应用/参数查看
查看>>
要看的
查看>>
[翻译]ASP.NET MVC 3 开发的20个秘诀(四)[20 Recipes for Programming MVC 3]:实现多语言支持...
查看>>
centos6.5下,使用虚拟ftp用户
查看>>
解决windows10 安装不了.net 3.5问题
查看>>
IMX6开发板-Android4.4-串口屏蔽gps文档及测试例程
查看>>
设计模式系列--Proxy
查看>>
VS2010生成Qt程序图标修改方法
查看>>
c++中调用cygwin/x使用ncl
查看>>
gcc -l参数和-L参数
查看>>
考分鄙视(exam)
查看>>
ural1090 In the Army Now
查看>>
动态逆序对
查看>>