私はプログラミングの割り当てに取り組んでおり、二分探索木を実装するための一連の関数を書いています。いくつかの関数が与えられています。再帰は理解できたと思っていたのですが、方向を切り替えるのに夢中になっています。
代入で与えられた関数は次のとおりです。
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
.
理解を助けてください。