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 2hnodes
inclusive at the last level h.
代码一适合任何形式的二叉树,代码二和代码三只适合本题所述形式的二叉树。
代码一:最简单,但时间超限
int countNodes(TreeNode* root) { if(NULL==root) return 0; int count(0); count=1+countNodes(root->left)+countNodes(root->right); return count; }
代码二:采用层序遍历的方式,统计层数和最后一层结点个数,还是时间超限
<pre name="code" class="cpp">int countNodes(TreeNode* root) { queue<TreeNode*> nodes; if(NULL==root) return 0; nodes.push(root); int depth(1); int result(0); while(!nodes.empty()) { int length=nodes.size(); int i=0; int k(0); while(i<length) { TreeNode* tmpNode=nodes.front(); nodes.pop(); if(tmpNode->left) { nodes.push(tmpNode->left); k++; } else break; if(tmpNode->right) { nodes.push(tmpNode->right); k++; } else break; i++; } if(i<length) { result=(1<<depth)-1+k; break; } depth++; } return result; }
<pre name="code" class="cpp">/** * 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 countNodes(TreeNode* root) { if(NULL==root) return 0; int height1(0),height2(0); TreeNode* p=root; while(p) { p=p->left; height1++; } TreeNode* q=root; while(q) { q=q->right; height2++; } if(height1==height2) return (1<<height1)-1; return 1+countNodes(root->left)+countNodes(root->right); } };
leetCode(19):Count Complete Tree Nodes
原文地址:http://blog.csdn.net/walker19900515/article/details/46591253