题目
给出一个完全二叉树,求出该树的节点个数。 说明:
完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。
若最底层为第 h 层,
则该层包含 1~ 2h 个节点。
示例: 输入:
1
/ \
2 3
/ \ /
4 5 6
输出: 6
思路一:层序遍历+计数
/**
* 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) {
queue<TreeNode*> que;
if(root!=NULL) que.push(root);
int num=0;
while(!que.empty())
{
//该层结点元素个数 = 该层队列元素
int size = que.size();
//这里要使用固定大小的size,不能使用que.size(),因为在处理中que.size是不断变化的
//将这层元素送入队列中并依次从队首向队尾将元素出队列,每个元素出队列的同时又将其不为空的子结点送入队列
for(int i =0;i<size;i++)
{
TreeNode* node = que.front();
//将队首元素送入该层结果
que.pop();
num++;
//将左右孩子结点入队列,作为下一层的元素
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
}
return num;
}
};
思路二:深度递归
确定遍历方式:后序遍历(左右中)
1、确定递归函数参数和返回值
参数:树的根结点
返回值:返回以该结点二叉树的结点数量,所以返回值为int类型。
int getNodesNum(TreeNode* cur)
2、终止条件
如果为空结点的话,就返回0,表示结点数为0.
该结点为NULL
if(cur== NULL) return 0;
3、单层逻辑
先求它的左子树的结点数量,再求右子树的结点数量,最后取总和再加1(加1是因为算上当前的中间结点),这就是目前结点为根节点的结点数量。
int leftNum = getNodesNum(cur->left); //左
int rightNum = getNodesNum(cur->right); //右
int nums=1+leftNum+rightNum; //中
return nums;
/**
* 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 getNodesNum(TreeNode* cur)
{
if(cur == NULL) return 0;
int leftNum = getNodesNum(cur->left); //左
int rightNum = getNodesNum(cur->right); //右
int nums=1+leftNum+rightNum; //中
return nums;
}
int countNodes(TreeNode* root) {
int times =getNodesNum(root);
return times;
}
};