2-3-4樹節點分裂分兩種情況。
1:節點分裂;2:根的分裂。
先要分裂的資料項目設為A,B,C
節點分裂
1.建立一個新的空節點。它是要分裂節點的兄弟,在要分裂節點的右邊。
2.資料項目C轉移到新節點上。
3.資料項目B轉移到要分裂節點的父節點上。
4.資料項目A保留在原來的節點上。
5.最右邊的兩個子節點從要分裂節點處斷開,串連到新節點上。
根的分裂
1.建立新的節點,作為根。它是要分裂節點的父節點。
2建立第二個新的空節點。它是要分裂節點的兄弟,在要分裂節點的右邊。
3資料項目C轉移到新節點上。
4資料項目B轉移到要分裂節點的父節點上。
5資料項目A保留在原來的節點上。
6.最右邊的兩個子節點從要分裂節點處斷開,串連到新節點上。
代碼public void split(Node thisNode) // split the node<br /> {<br /> // assumes node is full<br /> DataItem itemB, itemC; //資料項目B,C<br /> Node parent, child2, child3;//thisNode節點父節點,第3、4個子節點<br /> int itemIndex;</p><p> itemC = thisNode.removeItem(); // 資料項目C從thisNode節點移除<br /> itemB = thisNode.removeItem(); // 資料項目B從thisNode節點移除</p><p> child2 = thisNode.disconnectChild(2); // 節點的第3個子節點從節點中斷開<br /> child3 = thisNode.disconnectChild(3); //節點的第4個子節點從節點中斷開 </p><p> Node newRight = new Node(); // make new node</p><p> if(thisNode==root) // 如果是根節點,建立新的節點,作為根。它是要分裂節點的父節點。<br />{<br /> root = new Node(); // make new root<br /> parent = root; // root is our parent<br /> root.connectChild(0, thisNode); // connect to parent<br /> }<br /> else // this node not the root<br /> parent = thisNode.getParent(); // 得到節點的父節點</p><p> // deal with parent<br /> itemIndex = parent.insertItem(itemB); // 將資料項目B插入父節點,並返回插入的位置<br /> int n = parent.getNumItems(); // 父節點的資料項目總數</p><p>/*<br />*將父節點中子節點移動到合適的位置<br />*/<br /> for(int j=n-1; j>itemIndex; j--) // move parent's<br /> { // connections<br /> Node temp = parent.disconnectChild(j); // one child<br /> parent.connectChild(j+1, temp); // to the right<br /> }<br /> // connect newRight to parent<br /> parent.connectChild(itemIndex+1, newRight);//新節點與父節點相連</p><p> // deal with newRight<br /> newRight.insertItem(itemC); // item C to newRight<br /> newRight.connectChild(0, child2); // connect to 0 and 1<br /> newRight.connectChild(1, child3); // on newRight<br /> } // end split()<br />