###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 * |