まず、問題
https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/
その最大の深さを見つけるためのバイナリツリーを考えます。 バイナリツリーの深さは、最長パス最も遠いリーフノード上のノードにルートノードです。 説明:リーフノードは、ノードが子ノードを持たないです。 例: 所与のバイナリツリー[ 3、9、20は、NULL、NULL、15、7 ] 3 / \ 9 20 / \ 15 7 その最大深さに戻ります3。
二、GitHubのは達成:https://github.com/JonathanZxxxx/LeetCode/blob/master/MaxDepthClass.cs
ブログ:https://www.cnblogs.com/zxxxx/
第三に、アイデア
1、深さ優先探索、再帰:再帰DFSは最大を描き、子どもたちの周りにあることを
2、深さ優先探索、反復:ほとんどの深さのノードを取得します。ルートノードと1つのスタックの現在のノードの深さ、各反復の取得およびトップ要素を削除し、現在のノードの深さと現在の深さを比較し、最大値、現在の右の子ノードが空でない場合、現在のノードと右の子プラススタックの深さ、左の子共感
3、幅優先探索、反復:記録層バイナリツリー。ルートキュー、各繰り返し、現在の深さを追加し、現在のキュー長サイクル、各サイクルは、キュートップとシフト素子を得、現在のノードの左の子が空でない場合、キュー、右の子共感
第四に、コードの実装
パブリック クラスMaxDepthClass { パブリック クラスのTreeNode { 公共 int型のval; 公共のTreeNodeは左。 公共のTreeNode右。 公共のTreeNode(INT X){ヴァル= X。} } /// <要約> /// 深さ優先探索、再帰 /// </要約> /// ます。<param name = "ルート"> </ param>の /// <戻り値> </戻り値> 公共 int型MAXDEPTH( TreeNodeをルート) { もし(ルート== nullの)リターン 0 ; VAR左= MAXDEPTH(root.left)。 VAR右= MAXDEPTH(root.right)。 リターン Math.Max(左、右)+ 1 。 } /// <まとめ> /// 幅優先探索、反復 /// </要約> /// <PARAM NAME = "ルート"> </ PARAM> /// <戻りA> </戻りA> 公共 int型MaxDepthBFS( TreeNodeをルート) { もし(ルート== nullの)リターン 0 ; VaRのキュー= 新しいキュー<のTreeNode> (); queue.Enqueue(ルート)。 VaRの数= 0 ; しばらく(queue.Any()) { カウント ++ ; VARの長さ= queue.Count。 以下のために(INT iが= 0 ; I <長さを、I ++ ) { VAR電流= )queue.Dequeue(。 もし(!current.left = ヌル)queue.Enqueue(current.left)。 もし(!current.right = ヌル)queue.Enqueue(current.right)。 } } 戻り値の数。 } /// <要約> /// 深さ優先探索、反復 /// </要約> /// ます。<param name = "ルート"> </ param>の /// <戻り値> </戻り値> 公共 int型MaxDepthDFS( TreeNodeをルート) { もし(ルート== nullの)リターン 0 ; VaRのスタック= 新しいスタック<タプル<TreeNodeの、INT >> (); VaRの深さ= 0 ; stack.Push(新しいタプル<TreeNodeの、整数 >(ルート、1 )); しばらく(stack.Any()) { VAR電流= )stack.Pop(。 深さ = Math.Max(深さ、current.Item2)。 もし(!current.Item1.right = ヌル)stack.Push(新しいタプル<TreeNodeの、整数 >(current.Item1.right、current.Item2 + 1 )); もし(!current.Item1.left = ヌル)stack.Push(新しいタプル<TreeNodeの、整数 >(current.Item1.left、current.Item2 + 1 )); } 戻り値の深さ。 } }