if (current->right) { current = current->right; while (current->left) current = current->left; } else { BTNode* y = current->parent; while (y && current == y->right) { current = y; y = y->parent; } current = y; } return current; }
l 对于insert,需要修改查找失败时的指针内容,显然这是个内部指针(在双亲节点的内部,而不是象root和current那样在节点外面指向节点),这就要求find返回一个内部指针的引用。但是C++的引用绑定到一个对象之后,就不能再改变了,因此在find内部的实现是一个二重指针。insert操作还需要修改插入的新节点的parent指针域,因此在find中要产生一个能被insert访问的指向find返回值所在节点的指针,这里用的是current。实际上find返回的指针引用不是current->left就是current->right。这样一来,insert的实现就非常简单了。
l 对于remove,需要修改查找成功时的指针内容,同样是个内部指针。在find的基础上,很轻易就能得到这个内部指针的引用(BTNode* &p = find(data)。