LeetCode 完全二叉树的节点个数

给出一个完全二叉树,求出该树的节点个数。

说明:

完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 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) {
        //空
        if (root == NULL){
            return 0;
        }
        //叶节点
        if (root->left == NULL && root->right == NULL){
            return 1;
        }
        //根节点+左子树+右子树
        return 1 + countNodes(root->left) + countNodes(root->right);
    }
};

在这里插入图片描述
方法二:在不全部遍历的情况下,快速计算节点个数。 完全二叉树有如下规律:

leftHeight == rightHeight时, 左子树为满二叉树
leftHeight != rightHeight时,右子树为满二叉树
满二叉树节点个数为 2^height - 1

注:res += pow(2, leftHeight);应该为 res += 1 + pow(2, leftHeight) - 1;因为还要加个根结点。

/**
 * 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 heightDFS(TreeNode* root){
        return !root ? 0 : heightDFS(root->left) + 1;
    }
    
    int countNodes(TreeNode* root) {
        int res = 0;
        for ( ; root != nullptr; ){
            int leftHeight = heightDFS(root->left), rightHeight = heightDFS(root->right);
            if (leftHeight == rightHeight) {
                res += pow(2, leftHeight);//左子树为满二叉树
                root = root->right;
            } else {
                res += pow(2, rightHeight);//右子树为满二叉树
                root = root->left;
            }
        }
        return res;
    }
};

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41855420/article/details/88076349