给出一个完全二叉树,求出该树的节点个数。
说明:
完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
示例:
输入:
1
/ \
2 3
/ \ /
4 5 6
输出: 6
#这道题是中等,说实话,碰巧我在学BFS。。就感觉很简单,直接套模板
模板:
头结点进队列;
while(队列不为空)
{
size=tail-head;
for(int i=0;i<size;i++){
temp=队列出队;
//做需要的操作计数
这里计数,然后左右结点入队列
}
}
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int countNodes(struct TreeNode* root){
if(root==NULL) return 0;
struct TreeNode *node[50010];
struct TreeNode *temp;
int head=0;
int tail=0;
int num=1;
node[tail++]=root;
int size=0;
while(tail-head>0){
size=tail-head;
for(int i=0;i<size;i++){
temp=node[head++];
if(temp->left!=NULL){
printf("left:%d\n",temp->left->val);
node[tail++]=temp->left;
num++;
}
if(temp->right!=NULL){
printf("right:%d\n",temp->right->val);
node[tail++]=temp->right;
num++;
}
}
}
return num;
}
队列空间我给到了5万才过的..
DFS解法:
递归DFS:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int countNodes(struct TreeNode* root){
if(root==NULL) return 0;
int leftNum=countNodes(root->left);
int rightNum=countNodes(root->right);
return leftNum+rightNum+1;
}