本帖最后由 embeddedlwp 于 2012-05-13 19:40 编辑
prio_tree_remove函数中,最后会调用prio_tree_replace函数对节点进行替换- 143struct prio_tree_node *prio_tree_replace(struct prio_tree_root *root,
- 144 struct prio_tree_node *old, struct prio_tree_node *node)
- 145{
- 146 INIT_PRIO_TREE_NODE(node);
- 147
- 148 if (prio_tree_root(old)) {
- 149 BUG_ON(root->prio_tree_node != old);
- 150 /*
- 151 * We can reduce root->index_bits here. However, it is complex
- 152 * and does not help much to improve performance (IMO).
- 153 */
- 154 node->parent = node;
- 155 root->prio_tree_node = node;
- 156 } else {
- 157 node->parent = old->parent;
- 158 if (old->parent->left == old)
- 159 old->parent->left = node;
- 160 else
- 161 old->parent->right = node;
- 162 }
- 163
- 164 if (!prio_tree_left_empty(old)) {
- 165 node->left = old->left;
- 166 old->left->parent = node;
- 167 }
- 168
- 169 if (!prio_tree_right_empty(old)) {
- 170 node->right = old->right;
- 171 old->righ人t->parent = node;
- 172 }
- 173
- 174 return old;
- 175}
复制代码 以cluter兄画的这个图为例,
prio_tree_replace函数会执行两次:
一:
4,3,7 ->left = 4,2,6
4,2,6->parent=4,3,7
=============
4,2,6->left=4,2,6
4,2,6->parent=4,2,6
=============
4,2,6->right=5,1,6
5,1,6->parent=4,2,6
二:
0,7,7->right=5,2,7
5,2,7->parent=0,7,7
============
5,2,7->left=5,2,7
5,2,7->parent=5,2,7
============
5,2,7->right=6,1,7
6,1,7->parent=5,2,7
从置换的结果来看,5,2,7的parent指针指向了自己,5,2,7的left指针指向了自己,而不是4,2,6,是我什么地方理解错了吗? |