這是一個刷題博客,記錄leetcode上關於二叉樹欄目的刷題題解。node
若是沒有 「徹底二叉樹」 這個條件,那麼就用通常的,二叉樹計算節點數的方法來作。考慮深度優先遍歷,每一顆二叉樹均可以由其根節點、左子樹、右子樹組成。考慮這個遞歸模式,從根節點開始計算,而後每一輪都帶上該子樹的根節點,直到葉子節點的時候,就只有一個節點了!此時,節點個數就計算完成!算法
徹底二叉樹的概念,是隻有最後一層不滿,而前 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
/** * 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; } };
/** * 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; } };