二叉樹與徹底二叉樹計算節點數

二叉樹與徹底二叉樹計算節點數

這是一個刷題博客,記錄leetcode上關於二叉樹欄目的刷題題解。node

二叉樹的節點數(leetcode 222)

題目描述:徹底二叉樹的節點個數

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

算法分析與設計

思路 1

若是沒有 「徹底二叉樹」 這個條件,那麼就用通常的,二叉樹計算節點數的方法來作。考慮深度優先遍歷,每一顆二叉樹均可以由其根節點、左子樹、右子樹組成。考慮這個遞歸模式,從根節點開始計算,而後每一輪都帶上該子樹的根節點,直到葉子節點的時候,就只有一個節點了!此時,節點個數就計算完成!算法

思路 2

徹底二叉樹的概念,是隻有最後一層不滿,而前 n − 1 n-1 n−1 層都是滿二叉樹,對於滿二叉樹,它的節點個數爲 2 h − 1 2^{h}-1 2h−1,其中: h = n − 1 h=n-1 h=n−1。ide

因而,當前二叉樹只有兩種可能性:spa

  1. 是徹底二叉樹,用上述公式計算;
  2. 不是徹底二叉樹,可是其子樹有多是徹底二叉樹,而且葉子節點確定是徹底二叉樹,因而進行遞歸,計算左右子樹;

《思路 1》的AC代碼

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
private:
    void dfs(int& cnt, TreeNode*& root) {
        if (!root)
            return ;
        cnt++;
        dfs(cnt, root->left);
        dfs(cnt, root->right);
    }
public:
    int countNodes(TreeNode* root) {
        int res = 0;
        dfs(res, root);
        return res;
    }
};

《思路 2》的AC代碼

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int countNodes(TreeNode* root) {
        int res = 0;
        if (!root)
            return res;
        int lh = 0, rh = 0;
        TreeNode* lr = root;
        TreeNode* rr = root;
        while (lr) {
            lh++;
            lr = lr->left;
        }
        while (rr) {
            rh++;
            rr = rr->right;
        }
        if (lh == rh)
            res = ((1 << lh) - 1);
        else
            res = 1 + countNodes(root->left) + countNodes(root->right);
        return res;
    }
};

經過記錄

在這裏插入圖片描述

相關文章
相關標籤/搜索