您的位置:首页 > Web前端 > Node.js

Count Complete Tree Nodes

2015-10-04 12:39 651 查看
原题链接

题意

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[/code] 
思路

根据完全二叉树的性质, 左右子树的高度要么相等, 要么相差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);
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode tree