LeetCode 104バイナリツリーの最大深さ(C#実装) - 二分木、BFS、DFS、再帰、反復

まず、問題
https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/

その最大の深さを見つけるためのバイナリツリーを考えます。

バイナリツリーの深さは、最長パス最も遠いリーフノード上のノードにルートノードです。

説明:リーフノードは、ノードが子ノードを持たないです。

例:
所与のバイナリツリー[ 3920はNULLNULL157 ]

    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 ));
            }
            戻り値の深さ。
        }
    }

 

おすすめ

転載: www.cnblogs.com/zxxxx/p/12157289.html