题意
Given a complete binary tree, count the number of nodes.
Definition of a complete binary tree from Wikipedia:
In a complete binary tree every level, except possibly the last, is completely filled,
and all nodes in the last level are as far left as possible.
It can have between 1 and 2h nodes inclusive at the last level h.
wiki链接: https://en.wikipedia.org/wiki/Binary_tree#Types_of_binary_trees
思路
根据完全二叉树的性质, 左右子树的高度要么相等, 要么相差1.
当相等的时候, 其节点数为 (1 << height) - 1.
code
/**
* 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 getHeight(const TreeNode* root, const bool flag /*left: false, right: true*/) {
// if(root == NULL) return 0;
// if(flag) {
// return 1 + getHeight(root->right, flag);
// } else {
// 1 + getHeight(root->left, flag);
// }
// }
int getHeight(const TreeNode* root, const bool flag /*left: false, right: true*/) {
int h = 0;
if(root == NULL) return h;
while(root) {
h++;
if(flag) root = root->right;
else root = root->left;
}
return h;
}
int countNodes(TreeNode* root) {
/// method 1 --> O(n), where N is the number of nodes in the tree
/// Causing `Time Limit Exceeded`
// if(root == NULL) return 0;
// return 1 + countNodes(root->left) + countNodes(root->right);
/// method 2 --> O(N), where N is the number of nodes in the tree
/// Causing `Time Limit Exceeded`
// if(root == NULL) return 0;
// list<TreeNode*> q;
// q.push_back(root);
// int cnt = 0;
// while(!q.empty()) {
// TreeNode* f = q.front();
// q.pop_front();
// if(!f) break;
// cnt++;
// if(f->left) q.push_back(f->left);
// if(f->right) q.push_back(f->right);
// }
// return cnt;
/// method 3
/// 如果从某节点root起, 其左子树(包括root)的高度 == 其右子树(包括root)的高度
/// 那么以root为根的树一定是complete binary tree(complete binary tree的节点数为2^h - 1).
/// 如果高度不相等, 则递归调用 return countNode(left) + countNode(right) + 1.
/// 复杂度为O(h^2), h为树的高度/深度.
if(root == NULL) return 0;
// getHeight: using recursive may cause `Time Limit Exceeded`
int lh = getHeight(root, false);
int rh = getHeight(root, true);
if(lh == rh) return (1 << lh) - 1;
return 1 + countNodes(root->left) + countNodes(root->right);
}
};