私はプログラミングの割り当てに取り組んでおり、二分探索木を実装するための一連の関数を書いています。いくつかの関数が与えられています。再帰は理解できたと思っていたのですが、方向を切り替えるのに夢中になっています。
代入で与えられた関数は次のとおりです。
static void deleteAll(BSTNode<Data>* n) {
if (0 == n) return;
deleteAll(n->left);
deleteAll(n->right);
delete n;
}
非常に短いツリーを削除するには、
根 / \ 左利き右利き
私は電話しますdeleteAll(root)。n != 0だから今私は電話しますdeleteAll(lefty)。n != 0だから私は電話しますdeleteAll(lefty->left)。もちろん、左のノードはありません。lefty ノードを追加したとき、コンストラクターは左、右、および親のポインターを 0 に初期化したので、n == 0. したがって、関数から戻り、righty を削除することはありません。どうすれば にたどり着けますdeleteAll(n->right)か?
おっしゃる通り、この機能は提供されているので、変更する必要はありません。一番左または一番右のノードを呼び出すdeleteAll(b.begin())かb.end()、開始する必要があるのではないかと思いましたが、頭の中でそれを通過するたびにn == 0.
理解を助けてください。