b+樹的概念不再贅述,偶然得到一題目,原題是在磁碟中進行樹的操作,應該是使用檔案偏移和定位那個幾個函式 , 這裡簡單實現了b+樹在記憶體中的插入
先看一下b+樹的結構:
定義了非葉子節點和葉子節點,nextlevelpid是指向子節點,indexentry中有索引,leafnode是葉子節點,其中有資料data和指向下乙個葉子節點
class none_leaf_node;
struct node
virtual
int getnodeentrysize()
};struct none_leaf_node : public node
};struct leaf_node : public node
};
只實現了插入操作, 簡單理清一下思路:
初次插入是從葉子節點,當葉子節點中的資料多於每個節點最大儲存數量,則**
插入時需要尋找插入點,返回可以插入到的葉子節點
**是乙個遞迴的過程,從當前要**的點一直向上尋找父節點最後到根節點
**時考慮父節點是否為空,如果為空new乙個非葉子節點,當做根節點,儲存葉子節點
有很多情況未測試,見諒
bool insert(int key, int rid)
else
//調整葉子節點
adjustafterinsert(m_rootnode, 1);
return
true;
}else
auto itr = lnode->keyvalues.insert(pair(key, rid));
if (itr.second)
else
adjustafterinsert(lnode, 1);
return
true;}}
leaf_node *findinsertpoint(int key)
//根節點是非葉子節點 找到那個葉子節點
while (depth <= m_depth)
nextlevelnodesitr++;
}if (islower == false)
depth++;
}//處理葉子節點 depth == m_depth
return
static_cast
(curnode);
}
void adjustafterinsert(node *node, uint32_t depth)
if (depth > m_depth)
//判斷是非葉子節點還是葉子節點
if (typeid(*node) == typeid(none_leaf_node))
//加入到新節點
newnextnode->keys.push_back(curkey);
newnextnode->nextlevelnodes.push_back(*childitr);
}else
count++;
childitr++;
}//刪除原來的
curnode->keys.erase(delkeyitr, curnode->keys.end());
curnode->nextlevelnodes.erase(delchilditr, curnode->nextlevelnodes.end());
//調整父節點 父節點為空 當前是根節點
if (curnode->fathernode == nullptr)
else
}curnode->fathernode->nextlevelnodes.insert(itr2, newnextnode);
adjustafterinsert(curnode->fathernode, ++depth);}}
else
//葉子節點
nextleafnode->keyvalues.insert(itr);
}count++;
}//刪除原來的過半的 不可能有重複
auto eraseitr = curnode->keyvalues.lower_bound(insertkey);
curnode->keyvalues.erase(eraseitr, curnode->keyvalues.end());
int toinsertkey = nextleafnode->keyvalues.begin()->first;
//修改父節點
if (fathernode == nullptr)
else
}fathernode->nextlevelnodes.insert(itr2, nextleafnode);
adjustafterinsert(fathernode, ++depth);
} }}
B樹的插入
一 b樹的定義 1970年,r.bayer和e.m ccreight 提出了一種適合外查詢的樹,它是一種平衡的多叉樹,稱為b樹,有些地方寫的是b 樹,注意不要誤讀成 b減樹 1 b樹 b tree 是對2 3樹資料結構的擴充套件,又稱為多路平衡查詢樹,它的乙個節點可以擁有多於2個子節點的二叉查詢樹。...
B 樹的插入
一.b 樹的定義 一棵m階 m 2 的b樹,是一棵平衡的m路平衡搜尋樹,可以是空樹或者滿足一下性質 1.根節點至少有兩個孩子。2.每個非根節點至少有m 2 上取整 個孩子,至多有m 個孩子。3.每個非根節點至少有m 2 1 上取整 個關鍵字,至多有m 1個關鍵字,並且以公升序排列 4.ke y i ...
B樹 (插入操作)
一顆m階的b樹滿足一下特性 一 樹中的每個結點至多有m顆子樹,至少有顆子樹。除根結點和葉子結點外 其中表示m 2向上取整。二 樹中的每個結點至少有個關鍵字,至多m 1個關鍵字。當結點的關鍵字個數滿時,那麼該結點就需要 如何 假設 p結點已經有m 1個關鍵字,當再插入乙個關鍵字後,其關鍵字個數為m,超...