letecode [111] - バイナリツリーの最小深

バイナリツリーを考えると、その最小深さを見つけます。
最小深さは、最も近いリーフノードまでのルートノードから最短経路に沿ったノードの数です。
注:葉は子を持たないノードです。
例:
与えられたバイナリツリー[3,9,20、NULL、NULL、15,7]、
    3
   / \
  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メガバイトを

おすすめ

転載: www.cnblogs.com/lpomeloz/p/10994124.html