B 樹插入C 的簡單實現

2021-08-13 16:39:35 字數 2537 閱讀 6289

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,超...