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 對(duì)于insert,需要修改查找失敗時(shí)的指針內(nèi)容,顯然這是個(gè)內(nèi)部指針(在雙親節(jié)點(diǎn)的內(nèi)部,而不是象root和current那樣在節(jié)點(diǎn)外面指向節(jié)點(diǎn)),這就要求find返回一個(gè)內(nèi)部指針的引用。但是C++的引用綁定到一個(gè)對(duì)象之后,就不能再改變了,因此在find內(nèi)部的實(shí)現(xiàn)是一個(gè)二重指針。insert操作還需要修改插入的新節(jié)點(diǎn)的parent指針域,因此在find中要產(chǎn)生一個(gè)能被insert訪(fǎng)問(wèn)的指向find返回值所在節(jié)點(diǎn)的指針,這里用的是current。實(shí)際上find返回的指針引用不是current->left就是current->right。這樣一來(lái),insert的實(shí)現(xiàn)就非常簡(jiǎn)單了。
l 對(duì)于remove,需要修改查找成功時(shí)的指針內(nèi)容,同樣是個(gè)內(nèi)部指針。在find的基礎(chǔ)上,很輕易就能得到這個(gè)內(nèi)部指針的引用(BTNode* &p = find(data)。