二叉樹---深度

樹莓派派酒發表於2020-12-01

很基本的問題,依舊從遞迴遍歷或者層次廣度優先遍歷做起;


遞迴法


本題其實也要後序遍歷(左右中),依然是因為要通過遞迴函式的返回值做計算樹的高度。

按照遞迴三部曲,來看看如何來寫。

確定遞迴函式的引數和返回值:引數就是傳入樹的根節點,返回就返回這棵樹的深度,所以返回值為int型別。
程式碼如下:


int getDepth(TreeNode* node)
確定終止條件:如果為空節點的話,就返回0,表示高度為0。
程式碼如下:


if (node == NULL) return 0;
確定單層遞迴的邏輯:先求它的左子樹的深度,再求的右子樹的深度,最後取左右深度最大的數值 再+1 (加1是因為算上當前中間節點)就是目前節點為根節點的樹的深度。
程式碼如下:

class Solution {
public:
    int getDepth(TreeNode* node) {
        if (node == NULL) return 0;
        int leftDepth = getDepth(node->left);       // 左
        int rightDepth = getDepth(node->right);     // 右
        int depth = 1 + max(leftDepth, rightDepth); // 中
        return depth;
    }
    int maxDepth(TreeNode* root) {
        return getDepth(root);
    }
};

作者:carlsun-2
連結:https://leetcode-cn.com/problems/er-cha-shu-de-shen-du-lcof/solution/qiu-shu-de-zui-da-shen-du-xiang-jie-by-carlsun-2-3/

迭代法


使用迭代法的話,使用層序遍歷是最為合適的,因為最大的深度就是二叉樹的層數,和層序遍歷的方式極其吻合。

在二叉樹中,一層一層的來遍歷二叉樹,記錄一下遍歷的層數就是二叉樹的深度,如圖所示:

所以這道題的迭代法就是一道模板題,可以使用二叉樹層序遍歷的模板來解決的。

class Solution {
public:
    int maxDepth(TreeNode* root) {
        if (root == NULL) return 0;
        int depth = 0;
        queue<TreeNode*> que;
        que.push(root);
        while(!que.empty()) {
            int size = que.size();
            depth++; // 記錄深度
            for (int i = 0; i < size; i++) {
                TreeNode* node = que.front();
                que.pop();
                if (node->left) que.push(node->left);
                if (node->right) que.push(node->right);
            }
        }
        return depth;
    }
};

作者:carlsun-2
連結:https://leetcode-cn.com/problems/er-cha-shu-de-shen-du-lcof/solution/qiu-shu-de-zui-da-shen-du-xiang-jie-by-carlsun-2-3/

參考:https://leetcode-cn.com/problems/er-cha-shu-de-shen-du-lcof/solution/qiu-shu-de-zui-da-shen-du-xiang-jie-by-carlsun-2-3/

相關文章