面試題55 - I:二叉樹的深度(C++)


題目地址:https://leetcode-cn.com/problems/er-cha-shu-de-shen-du-lcof/

題目描述

 輸入一棵二叉樹的根節點,求該樹的深度。從根節點到葉節點依次經過的節點(含根、葉節點)形成樹的一條路徑,最長路徑的長度為樹的深度。

題目示例

例如:

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

3
/ \
9 20
/ \
15 7
返回它的最大深度 3 。

解題思路

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

DFS(深度優先搜索-遞歸):深度優先搜索方法常常采用遞歸或者棧的方法實現,在這里我們使用遞歸的方法解決,直接返回樹的深度等於左子樹和右子樹之中的最大值+1,即h = max(maxDepth(root->letf), maxDepth(root->right) + 1。二叉樹的深度計算方法如下

  • 如果二叉樹為一個節點,則二叉樹深度h=1
  • 如果二叉樹沒有左子樹,則二叉樹深度h=右子樹深度+1,反之,如果二叉樹沒有右子樹,則二叉樹深度h=左子樹深度+1
  • 如果二叉樹既有左子樹又有右子樹,則則二叉樹深度h=max(左子樹深度,右子樹深度)+1

DFS(深度優先搜索-非遞歸-棧):中序遍歷順序為”左子樹->根節點->右子樹“,在這里我們使用中序遍歷方法找到二叉樹的最大深度,從根節點開始,此時並不需要將根節點入棧,先遍歷左子樹,將左子樹所有元素入棧之后,再將根節點入棧,最后,右子樹入棧。

BFS(廣度優先搜索):廣度優先搜索方法常采用隊列來實現,遍歷隊列中的各節點,並將其左子節點和右子節點分別加入隊列。然后,對二叉樹一層一層遍歷,每遍歷一層,深度加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 == nullptr) return 0;
    
return max(maxDepth(root->left), maxDepth(root->right)) + 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 == nullptr) return 0;
        stack<pair<TreeNode*, int>> s;
        int deep = 0, cur_deep = 0;
        TreeNode* p = root;
        while(!s.empty() || p != nullptr) //若棧非空,則表示還有一些元素的右子樹未訪問,若p非空,則說明還有一些元素的左子樹未訪問,
        {
            while(p != nullptr)
            {
                s.push(pair<TreeNode*, int>(p, ++cur_deep)); //一直往左子樹走,直到葉子節點
                p = p->left;
            }
            p = s.top().first;
            cur_deep = s.top().second;
            if(cur_deep > deep) deep = cur_deep;
            s.pop();
            p = p->right;
        }
        return deep;
    }
};

BFS(隊列)

/**
 * 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 == nullptr) return 0;
        queue<TreeNode*> que;
        que.push(root);
        int depth = 0;
        while(!que.empty()) //隊列不為空,表示還有元素未訪問
        {
            depth++;
            int cur_len = que.size();
            for(int i = 0; i < cur_len; i++) //一個for循環表示一層
            {
                TreeNode* curNode = que.front();
                que.pop();
                if(curNode->left != nullptr) que.push(curNode->left);
                if(curNode->right != nullptr) que.push(curNode->right);
            }
        }
        return depth;
    }
};


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM