添加結(jié)點MappingNode
增加子結(jié)點策略:每個結(jié)點下面有多個子節(jié)點,每個節(jié)點主要記錄最左子結(jié)點和右兄弟結(jié)點,多個孩子時,子結(jié)點按照從大到小順序從左到右進(jìn)行排序。最右面的結(jié)點的有兄弟結(jié)點=null
root:root節(jié)點
leftMostChild :root結(jié)點的最左子結(jié)點
child:當(dāng)前要插入的結(jié)點
position:遍歷的計數(shù)器,記錄遍歷的當(dāng)前結(jié)點
prev:遍歷的計數(shù)器,記錄遍歷的當(dāng)前節(jié)點的前一個結(jié)點
public void linkAsChild(final MappingNode child) {
1.leftMostChild 不存在,root添加child作為leftMostChild
if (this.leftMostChild == null) { this.leftMostChild = child;
2.leftMostChild存在,依次遍歷子結(jié)點,從leftMostChild 開始:
} else { MappingNode prev = null; MappingNode position = this.leftMostChild; while (true) {
2.1position=null,遍歷到最右,將child添加到最后一個子結(jié)點prev后
if (position == null) { prev.sibling = child; break; }
2.2child>position,
int c = child.getMapping().compareTo(position.getMapping()); if (c < 0) {
2.2.1prev==null,root添加child作為leftMostChild
child.sibling = position; if (prev == null) { this.leftMostChild = child;
2.2.2prev!=null,child插入prev和position中間
} else { prev.sibling = child; } break;
2.3child<=position,比較下一個結(jié)點,從1)開始
} else { prev = position; position = position.sibling; } } } }
圖: