LeetCode 集錦(二十三) - 第 104 題 Maximum Depth of Binary Tree

問題

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],node

3
 / \
9  20
  /  \
 15   7 
複製代碼

返回結果是3git


解題思路

本題是獲取一棵樹的深度,通常設計到樹到題仍是有點麻煩到,第一步想到算深度?是否能夠按層級遍歷,不就知道有多少層了嘛。這是一種方式,可是換一個角度想,一棵樹的深度,不就是由它的左右節點決定的嘛,若是有左右節點就加一,同理,左右節點的深度又是由它們的子左右節點決定的,選擇大的那個深度值,貌似就能夠解決此題了github

解題方法

  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)bash

    空間複雜度: 該方案使用了額外的空間,使用了數組暫存樹,至關於把樹轉化爲了數組,因此空間複雜度O(n)=O(n)ui

  2. 遞歸分治法:spa

    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)設計

總結

本題的大體解法如上所訴,按層級遍歷其實效果不怎麼理想,我的估計是remove的操做致使的,若是能夠不刪除,直接數組代替樹,效果可能會好一點。code

歡迎關注個人博客-FightCrap

相關文章
相關標籤/搜索