[LeetCode] Count Complete Tree Nodes

Count Complete Tree Nodes

Given a complete binary tree, count the number of nodes.

Definition of a complete binary tree from Wikipedia:
In a complete binary tree every level, except possibly the last, is completely filled, and all nodes in the last level are as far left as possible. It can have between 1 and 2hnodes inclusive at the last level h.

解题思路:

题意为计算完全二叉树的节点数目。完全二叉树是指除了最底层的节点之外的节点都有两个孩子节点,且最底层的节点尽量靠左的二叉树。

解法1:暴力遍历法,用递归一个个遍历。这种方法的时间复杂度为O(N),会产生超时错误。

/**
 * 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;
        }
        return 1 + countNodes(root->left) + countNodes(root->right);
    }
};

解法2:注意到对于一个完全二叉树来说,任何一个节点,以其左/右孩子为根节点的子树高度最多相差一,且最多只有一个子树不是满二叉树(除叶子节点外,所有节点都有两个子节点,且叶子节点在同一层)。计算某个节点ROOT的最左和最右高度LH、RH,若LH==RH,那么以该节点为根节点的子树节点数目为2^(LH)-1,否则节点数目=1+以ROOT->left为根节点的子树节点数目+以ROOT->right为根节点的子树节点数目

注意一个小技巧,2^n次方可以通过移位来获得。

该方法的时间复杂度为O(h^2),因为最耗时的操作是计算以某个节点为根节点的树的高度,最差情况下扫描次数为(1+2+...+h)*2。

/**
 * 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;
        }
        int leftH = getLeftHeight(root);
        int rightH = getRightHeight(root);
        if(leftH == rightH){
            return ( (1<<leftH) - 1);
        }
        return 1 + countNodes(root->left) + countNodes(root->right);
    }
    
    int getLeftHeight(TreeNode* root){
        int h = 0;
        while(root!=NULL){
            h++;
            root = root->left;
        }
        return h;
    }
    
    int getRightHeight(TreeNode* root){
        int h = 0;
        while(root!=NULL){
            h++;
            root = root->right;
        }
        return h;
    }
};


0 条评论

    发表评论

    电子邮件地址不会被公开。 必填项已用 * 标注