したがって、コンピューターサイエンスの基本的な概念を読む前に。
- バイナリツリーは、動的に割り当てられた構造です(通常、順序付けられたストレージに使用されます)。
- その性質のため、バイナリツリーの走査は通常再帰的です。
これは、ループの2つの方法がある場合、(ループを介した)線形トラバーサルが自然ではないためです。- 再帰的:これは、それ自体を呼び出す関数を意味します。
- 昔ながらの言語では、メモリ管理には手動のメモリ管理が必要です。
- マニュアル:自分でやらなければならないことを意味します。
- 手動でメモリ管理を行う場合、実際にツリーの各メンバーを解放するように、基礎となるシステムに依頼する必要があります。
- 無料:メモリをグローバルpoosに回復し、再利用できるようにします。メモリが不足することはありません。
- 解放:これは、関数
free()
を呼び出して、回復したいポインターを渡すことによって行われます。 - ポインター:仮想スティックのようなものです。最後はメモリです。メモリを要求すると、メモリのあるポインタ(仮想スティック)が与えられます。完了したら、ポインター(仮想スティック)を返します。
再帰的な解決策:
freeTree(Node* node)
{
freeTree(node->left);
freeTree(node->right);
free(node);
}
問題は、再帰は同じ関数を繰り返し呼び出していることを意味するということです。これによりスタックが大きくなります。スタックを大きくすると、より多くのメモリが使用されます。ツリーを解放する理由は、より多くのメモリを使用してメモリを戻す必要があるためです(メモリの両方のビットを取り戻す場合でも)。
最後に質問:
したがって、問題の中心は、上記の再帰バージョンを線形ソリューションに変換することです(したがって、メモリを使用する必要はありません)。
ノードタイプを指定します
typedef struct Node Node;
struct Node
{
Node* left;
Node* right;
};
これらのノードのツリーを解放する関数を作成します。
制限事項:
- 再帰を使用できません(間接的にも)
追跡用のダイナミックスペースを割り当てることができません。
O(n)ソリューションがあることに注意してください
勝者:
- 最高の複雑さ。
- タイブレーク1:最初の送信
- タイブレイク2:キャラクターの最小数。