二叉樹的最大/最小深度(C++ leetcode104.11)

104. 二叉樹的最大深度

給定一個二叉樹,找出其最大深度。

二叉樹的深度爲根節點到最遠葉子節點的最長路徑上的節點數。

說明: 葉子節點是指沒有子節點的節點。

示例:

給定二叉樹 [3,9,20,null,null,15,7],

	3
   / \
  9  20
    /  \
   15   7

返回它的最大深度 3 。

解法1:遞歸 - 深度優先搜索(DFS)

/**
 * Definition for a binary tree node.
 * 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==NULL) return 0;
        else{
            int left_height = maxDepth(root->left);
            int right_height = maxDepth(root->right);
            return max(left_height,right_height)+1;
        }
    }
};
複雜度分析

時間複雜度:我們每個結點只訪問一次,因此時間複雜度爲 O(N),其中 N 是結點的數量。

空間複雜度:在最糟糕的情況下,樹是完全不平衡的,例如每個結點只剩下左子結點,遞歸將會被調用 N 次(樹的高度),因此保持調用棧的存儲將是 O(N)。但在最好的情況下(樹是完全平衡的),樹的高度將是 log(N)。因此,在這種情況下的空間複雜度將是 O(log(N)。

解法2:廣度優先搜索(BFS)

//直接改寫按序遍歷二叉樹的代碼,輸出二維數組的元素個數即可
class Solution {
public:
    int maxDepth(TreeNode* root) {
        vector <vector <int>> ret;   //定義輸出的二維數組
        if (!root) return 0;  //如果沒有節點,輸出0

        queue <TreeNode*> q;   //定義結構體隊列q
        q.push(root);  //將根節點加入進去
        while (!q.empty()) {  //當隊列不爲空時,即表示二叉樹還存在左右子樹
            int currentLevelSize = q.size();  //當前隊列q內的元素個數
            ret.push_back(vector <int> ());  //輸出ret加入一個新的空vector
            for (int i = 1; i <= currentLevelSize; i++) {
                auto node = q.front(); q.pop();  //node取爲q的第一個元素,再去掉這個元素
                ret.back().push_back(node->val);  //給ret的最後一個元素即空vector加入q的第一個元素
                if (node->left) q.push(node->left);  //如果存在左節點,給隊列q加入該節點
                if (node->right) q.push(node->right);
            }
        }
        return ret.size();
    }
};

//不需要定義二維數組,用一個int型變量表示即可
class Solution {
public:
    int maxDepth(TreeNode* root) {
        if (!root) return 0;  //如果沒有節點,輸出0
	    int depth=0;
        queue <TreeNode*> q;   //定義結構體隊列q
        q.push(root);  //將根節點加入進去
        while (!q.empty()) {  //當隊列不爲空時,即表示二叉樹還存在左右子樹
            int currentLevelSize = q.size();  //當前隊列q內的元素個數
            for (int i = 1; i <= currentLevelSize; i++) {
                auto node = q.front(); q.pop();  //node取爲q的第一個元素,再去掉這個元素
                if (node->left) q.push(node->left);  //如果存在左節點,給隊列q加入該節點
                if (node->right) q.push(node->right);
            }
            depth++;
        }
        return depth;
    }
};

111. 二叉樹的最小深度

給定一個二叉樹,找出其最小深度。

最小深度是從根節點到最近葉子節點的最短路徑上的節點數量。

說明: 葉子節點是指沒有子節點的節點。

示例:

給定二叉樹 [3,9,20,null,null,15,7],

	3
   / \
  9  20
    /  \
   15   7

返回它的最小深度 2.

解法 - 遞歸
int minDepth(TreeNode* root) {
        if(root == NULL) return 0;  //空樹深度爲0
        if(root -> left == NULL && root -> right == NULL) return 1; //左右子樹爲空,深度爲1
        //根據題意,若一顆子樹爲空,則最小深度爲非空子樹的最小深度加一
        if(root -> left == NULL && root -> right != NULL) return minDepth(root -> right) + 1;
        if(root -> left != NULL && root -> right == NULL) return minDepth(root -> left) + 1;
        //若兩顆子樹都非空,則最小深度爲左右子樹最小深度較小者加一
        return min(minDepth(root -> left), minDepth(root -> right)) + 1;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章