LeetCode 1123最も深い葉の最低共通の祖先

ここでのオリジナルタイトルリンク:https://leetcode.com/problems/lowest-common-ancestor-of-deepest-leaves/

トピック:

根ざしたバイナリツリーを考えると、その最も深い葉の最低の共通の祖先を返します。

それを思い出します:

  • バイナリツリーのノードがあり  、葉  、それは子を持たない場合にのみ場合
  • 深さ  の木の根元のは0であり、ノードの深さがある場合  d、その子のそれぞれの深さがあります  d+1
  • 最下位共通祖先  セットの  S ノードは、ノードである  A S内のすべてのノードがルートとサブツリー内であるような最大深さを有します  A

 

例1:

入力:ルート= [1,2,3] 
出力:[1,2,3] 
説明:
最も深い葉は値2と3とのノードである
これらの葉の最下位共通祖先は、値1を有するノードである
回答返さ「[1,2,3]」シリアライゼーションとTreeNodeオブジェクト(配列ではない)です。

例2:

入力:ルート= [1,2,3,4] 
出力:[4]

例3:

入力:ルート= [1,2,3,4,5] 
出力:[2,4,5]

制約:

  • 与えられた木は1〜1000のノードを持つことになります。
  • ツリーの各ノードは、1〜1000の異なる値を有することになります。

ソリューション:

DFSの場合、状態は、現在のツリーノードのルートを必要とします。戻り値は、深さと最も深い葉ノードのLCAの両方を必要とします。

分割統治は、最初の結果、右の結果を残しています。次に、深さを比較両側が同じ深さ、深さ+ 1戻りルートを持っている場合、より大きな側を選びます。

時間計算:O(n)を。n個のノードがツリー全体のカウントです。

スペース:O(LOGN)。

ACのJava:

1  / ** 
2  分木のノードのための*の定義。
3  *パブリッククラスツリーノード{
 4  * INTヴァル。
5  *のTreeNodeは左。
6  *のTreeNode右;
7  *ツリーノード(INT X){ヴァル= X。}
 8  *}
 9   * / 
10  クラスソリューション{
 11      公衆ツリーノードlcaDeepestLeaves(ツリーノードのルート){
 12          であれば(ルート== NULL ){
 13              リターンルート。
14          }
 15          
16          リターンlcaDfs(ルート).nodeファイル。
17     }
 18      
19      プライベートペアlcaDfs(ツリーノードのルート){
 20          であれば(ルート== NULL ){
 21              リターン 新しいペア(ルート、0 );
22          }
 23          
24          ペアL = lcaDfs(root.left)。
25          ペアR = lcaDfs(root.right)。
26          であれば(l.depth> r.depth){
 27              リターン 新しい対(l.node、l.depth + 1 )。
28          } そう であれば(l.depth < r.depth){
 29              リターン 新しいです対(r.node、r.depth + 1 )。
30          } {
 31              リターン 新しい対(ルート、l.depth + 1 )。
32          }
 33      }
 34  }
 35  
36  クラス対{
 37      ツリーノードのノードと、
38      int型の深さ。
39      公衆ペア(ツリーノードのノード、INT 深さ){
 40          この .nodeファイル= ノード。
41          この .depth = 深度。
42      }
 43 }

 

おすすめ

転載: www.cnblogs.com/Dylan-Java-NYC/p/12042281.html