バイナリツリーを考えると、その最小深さを見つけます。
最小深さは、最も近いリーフノードまでのルートノードから最短経路に沿ったノードの数です。
注:葉は子を持たないノードです。
例:
与えられたバイナリツリー[3,9,20、NULL、NULL、15,7]、
3
/ \
9 20
/ \
15 7
/ \
9 20
/ \
15 7
= 2の最小深さを返します。
効果の件名:
バイナリツリーを考えると、それが葉ノード(すなわちノード)にルートノードから最小経路を計算します。
理解:
彼らの考え方は次のとおりです。現在の最小深さとして、最初のリーフノードを見つけ、子ノードへのアクセスダウン、ルートから始まります。深さが最小のサブツリーを更新する最小深さよりも小さいプルーニングさより大きい場合、他の背後にあるサブツリーを横断します。少し時間が一時的にそれをデバッグするのではなく、非常に奇妙な問題を実現します。
他人の考えをお読みください。これは本当に素晴らしいです。現在のノードがリーフノードであるキューに左右サブツリーノードのアクセスが空である場合、レベルを横断支援、それは層の現在の数を返すことができます。
コードC ++:
/ **
*バイナリツリーノードの定義。
*構造体のTreeNode {
* INTヴァル。
*のTreeNode *左;
*のTreeNode *右;
*ツリーノード(int型X):(NULL)左のval(X)、右(NULL){}
*}。
* /
クラスソリューション{
パブリック:
int型minDepth(TreeNodeの*ルート){
場合(ルート== NULL)の戻り0;
IF(root->左== NULL && root->右== NULL)リターン1。
キュー<TreeNodeの*> Q;
q.push(ルート)。
int型のサイズ。
INTレベル= 0。
一方、{(q.empty()!)
サイズ= q.size()。
レベル++;
一方、(サイズ> 0){
ツリーノード*ノード= q.front()。
q.pop();
(ノード- >左== NULL &&ノード- >右== NULL)場合は
リターンレベル。
IF(!ノード- >左= NULL){
q.push(ノード- >左)。
}
(!ノード- >右= NULL)であれば{
q.push(ノード- >右)。
}
size--。
}
}
レベルを返します。
}
}。
結果:
で実行されたとき:20 MSの メモリ消費量: 19.7メガバイトを