ここでのオリジナルタイトルリンク: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 }