[leetcode]maximum-depth-of-binary-tree

RioDream發表於2019-05-10

RT

思路

  1. 遞迴, 左子樹和右子樹的高度比較大的那一個加1,就得到樹的最大高度
  2. 第二種當時怎麼寫的我自己也弄不清楚了,也是遞迴。。。

Solution 1

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int maxDepth(TreeNode *root) {
        if(root!=nullptr){
            int left_h = maxDepth(root->left); //左子樹高度
            int right_h = maxDepth(root->right); //右子樹高度
            int max_h = left_h>right_h?left_h:right_h;
            return max_h+1;
            //寫成這樣就會超時了,時間複雜度從 O(2^n) -> O(4^n)
            //return maxDepth(root->left)>maxDepth(root->right)?maxDepth(root->left)+1:maxDepth(root->right)+1;
        }else{
            return 0;
        }
    }
};

Solution 2

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    Solution(){depth=0;lastDepth=0;}
    int depth; //應該為private
    int lastDepth; //應該為private
    int maxDepth(TreeNode *root) {
        if(root!=nullptr){
            depth++; //到達新的節點,深度+1 
            //dep當前層的深度,先儲存一下,便於從左子樹回來或者右子樹回來的時候直接將depth置為dep
            int dep=depth; 

            //遍歷左子樹,更新depth為往左子樹走能達到的深度
            maxDepth(root->left);


            //走到深度更深的位置,替換
            if(depth>lastDepth){
                lastDepth = depth;
            }

            //如果從左子樹回溯回來,要將depth-- ,回到depth
            if(root->left){
                //這兩句是一樣的, 左子樹回來的時候depth-1即可,但是右子樹回來的時候就要利用到dep了。
                depth--;
                //depth = dep;
            }

            //看右子樹的深度
            maxDepth(root->right);

            //從右子樹回來,depth回到當前層的深度
            if(root->right){
                depth = dep;
            }

        }
        return lastDepth;
    }
};