B树删除实现中第二个if语句是否会被执行?
B树删除逻辑中的条件判断疑问解析
问题背景
以下是B树删除逻辑的代码片段:
bool flag = ((idx == n) ? true : false); if (C[idx]->n < t) fill(idx); if (flag && idx > n) C[idx - 1]->deletion(k);
初看第二个if的条件flag && idx > n存在矛盾:flag仅在idx == n时为true,此时idx > n显然不成立,似乎永远不会触发。猜测fill(idx)可能修改了idx的值,但无法理解原理,需要解析。
对应的fill函数代码如下:
void BTreeNode::fill(int idx) { if (idx != 0 && C[idx - 1]->n >= t) borrowFromPrev(idx); else if (idx != n && C[idx + 1]->n >= t) borrowFromNext(idx); else { if (idx != n) merge(idx); else merge(idx - 1); } return; }
核心解析
首先明确:fill函数不会修改外部的idx变量——因为idx是按值传递的,函数内部的操作不会影响外部的idx值。真正的原因是fill函数会修改当前节点的n(关键字数量):
当flag为true时,说明初始状态是idx == n(要删除的关键字对应最后一个子节点分支)。此时调用fill(idx),如果进入else分支的merge(idx - 1)(因为idx == n),合并操作会把当前节点的第idx-1和第idx个子节点合并,同时当前节点的n会减少1(合并过程会消耗一个父节点关键字)。
此时外部的idx还是原来的n(合并前的值),但当前节点的n已经变为原n-1,所以idx > n的条件就成立了,再加上flag保持true,第二个if的条件就满足,会执行C[idx - 1]->deletion(k)——这正是合并后的子节点,符合B树删除的逻辑。
举个实例:
假设原节点n=3,idx=3(此时flag=true)。调用fill(3)触发merge(2),合并后节点的n变为2。此时idx=3,n=2,满足idx > n,第二个if执行,调用合并后的子节点C[2]的删除方法。
内容的提问来源于stack exchange,提问作者Sidharth Mudgil
相关产品推荐
相关产品推荐

