LeetCodeコレクション(XXIII) - バイナリツリーの最初の104タイトル最大の深さ

問題

Given a binary tree, find its maximum depth. 

 The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node. 

 Note: A leaf is a node with no children. 

 Example: 

 Given binary tree [3,9,20,null,null,15,7], 

    3
   / \
  9  20
    /  \
   15   7 

 return its depth = 3. 

复制代码

翻訳:

その最大の深さを求めて、バイナリツリーを考えます。最大深さは、最も遠いリーフノードへのルートから最長パス上のノードの数です。注意:葉は、ノードが子を持たないです。例:与えられたバイナリツリー[3,9,20、NULL、NULL、15,7]、

  3
 / \
9  20
  /  \
 15   7 
复制代码

結果は3であります


問題解決のためのアイデア

この質問は、深さの木を得ることです、とタイトルや小さなトラブルにツリーの一般的な設計は、最初のステップ数の深さを考えますか?階層的にトラバースすることができ、私はどのように多くの井戸の層を知りません。これは、1つの方法ですが、別の観点からのツリーの深さによくその左右のノードによって決定されていない、あなたが追加した場合のノードが同じトークンについて、順番に、そのサブノードの深さについて持っていますノードの決定について、奥行き値の選択は、私たちはこの問題解決することができるようになります。

問題解決のアプローチ

  1. 階層的な方法を横断するためによると

     public int maxDepth(TreeNode root) {
    
         if (root == null) {
             return 0;
         }
         int result = 1;
         //定义一个队列
         List<TreeNode> list = new LinkedList<>();
         putNode(root, list);
         while (list.size() > 0) {
             //通过遍历的方式把队列里面的数据获取,并把左右子节点塞入
             int size = list.size();
             while (--size >= 0) {
                 TreeNode treeNode = list.get(size);
                 putNode(treeNode, list);
                 list.remove(size);
             }
             result++;
         }
         return result;
    
     }
    
     private void putNode(TreeNode treeNode, List<TreeNode> list) {
    
         if (treeNode == null) {
             return;
         }
         if (treeNode.left != null) {
             list.add(treeNode.left);
         }
         if (treeNode.right != null) {
             list.add(treeNode.right);
         }
     }
    
     class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
    
        TreeNode(int x) {
            val = x;
        }
     }
    
    复制代码

    時間複雑:階層的な方法を横断するために使用される方式は、それぞれが時間複雑トラバーサルに対応するが、それはO(N)= O(N )

    空間複雑:プログラムが一時配列ツリーを使用して、追加のスペースを使用して、ツリーは、変換配列と同等であるので、O(N)= O(n個の空間の複雑さ )

  2. 再帰分割統治:

     public int maxDepth(TreeNode root) {
         if (root == null) {
             return 0;
         }
         return Math.max(maxDepth(root.left) + 1, maxDepth(root.right) + 1);
     }
    
    
     public class TreeNode {
         int val;
         TreeNode left;
         TreeNode right;
    
         TreeNode(int x) {
             val = x;
         }
     }
    复制代码

    時間複雑さ:実施形態の再帰的トラバーサルを持つプログラムは、トラバーサルのそれぞれの時間複雑性はそれほどO(N)= O(nは、に相当します )

    宇宙複雑:スペースの複雑さはO(n)= O(1ようにプログラムは、余分なスペースを使用していません )

概要

この問題の解決は、個人的な推定値を削除し、実際には階層トラバーサルない非常に良い効果によると、実質上の魅力の上にある、あなたが効果が良いかもしれ、配列の代わりに木を指示し、削除することができない場合、操作の結果です。

私のブログに注意を歓迎-FightCrap

ます。https://juejin.im/post/5cfcad26f265da1b7e102a90で再現

おすすめ

転載: blog.csdn.net/weixin_34128501/article/details/91421683