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

2020-03-11  本文已影响0人  __LXF__

1、题目描述

给出一个完全二叉树,求出该树的节点个数。
说明:
完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
示例:


image.png

2、思路

对于满二叉树来说,假定高度为N;则它的节点数为2^N - 1。
因而可以将一个完全二叉树分解成若干个满二叉树和完全二叉树。对于完全二叉树用递归求节点数。

3、代码实现(C++)

/**
 * 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 == nullptr) {
            return 0;
        }
        int left = countLevel(root->left);
        int right = countLevel(root->right);
        if (left == right)  {
            // 左右等高,是满二叉树; 递归求右子树节点数,再加上左子树节点数 2^left-1,再加上根节点
            return countNodes(root->right) + (1 << left);
        }
        else {
            // 左子树比右子树高,表示右子树是满二叉树,可以直接求节点数,2^right-1,加上根节点;
            // 而左子树是完全二叉树,需要递归求解
            return countNodes(root->left) + (1 << right);
        }
    }

    // 对于一个完全二叉树而言,树的高度就是左子树的高度+1.
    int countLevel(TreeNode* root) {
        int level = 0;
        while (root != nullptr) {
            level++;
            root = root->left;
        }
        return level;
    }
};
上一篇下一篇

猜你喜欢

热点阅读