LeetCode 222. 完全二叉树的节点个数

164 阅读2分钟

题目

给出一个完全二叉树,求出该树的节点个数。 说明:
完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。
若最底层为第 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;
    }
};