这是一个刷题博客,记录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; } };