###summary
遍历路由树,查找是否存在key
这条路由。
如果有则返回对应的节点 struct leaf *
,
否则返回NULL。
中间节点 和 叶子节点
路由树(fib lc tree)是个多叉树,树的每个节点是struct rt_trie_node
。
每个节点的分叉个数(X
)是可变的, 由 struct rt_trie_node
里的bits
决定。
X
= 2 的bits
次幂次方。
叶子节点的首个子类型也是struct rt_trie_node
,所以可以看成是其派生。
树的遍历
如果当前节点为空, 结束循环。
如果当前节点不是
T_TNODE
,结束循环。
即:当前节点为 叶子节点T_LEAF
.比较当前节点
tn
和参数key
的未比较过的前缀
是否匹配。
tkey_sub_equals(tn->key, x, y, key))
未比较过的前缀
指[x-y)
这个区间的位,包括x
,不包括y
。x
= 父节点的pos
+ 父节点的bits
(父节点为空时,x取0)y
= 当前节点的pos
+ 父节点的pos
这里,具体取哪些位石油父节点和当前节点刚提决定的。如果相等,则结束循环,判断当前节点是否真正匹配。
如果不相等,则跳到第
N
个一个孩子节点。N = tkey_extract_bits(key, tn->pos, tn->bits)
N
是取从参数key
的第tn->pos
位开始, 共tn->bits
位转化出来的值。
注意,此处是取key
的某一位或者几位的值,而具体怎么取值是有当前节点的(pos,bits)决定的。
完整判断
当前节点n
是叶子节点,并且key
完全相同
n != NULL && IS_LEAF(n) && tkey_equals(key, n->key))
1 | 954 static struct leaf * |