• [nowCoder] 完全二叉树结点数


    给定一棵完全二叉树的头节点head,返回这棵树的节点个数。如果完全二叉树的节点数为N,请实现时间复杂度低于O(N)的解法。 

    分析:遍历的话不管是前序、中序、后序还是层次都是O(N),低于O(N)只能是O(lgN),向二分方向努力。

    完全二叉树:除最后一层外,每一层上的节点数均达到最大值;在最后一层上只缺少右边的若干结点

    只有最后一层不满,我们可以根据左子树的最右节点或者右字数的最左节点来判断左子树是不是满二叉树,

    若左字树满,可用公式计算左字树的节点数2^(l-1), 总节点数n= 2^(l-1)+ 1(根节点)+递归右子树的节点数。

    若左字树不满,可知右子树满,层数为l-2,可用公式计算左字树的节点数2^(l-2), 总节点数n= 2^(l-2)+ 1(根节点)+递归左子树的节点数。

    判断左子树的最右节点或者右字数的最左节点是否存在可以从层数上来判断。。

    class Solution {
    private:
            int calcHeight(TreeNode *head)
            {  
                int height = 0;
                while(head)
                {  
                    head = head->left;
                    height ++;
                }  
                return height;
            }  
        public:
            int nodeNum(struct TreeNode* head)
            {  
                if(head == NULL)
                    return 0;
     
                int height = calcHeight(head);
                //cout << "height	" <<height << endl;
     
                if(calcHeight(head->right) == height - 1)//left sub-tree is full
                    return (1 << (height - 1) )+ nodeNum(head->right);
                else// right sub-tree is full
                    return (1 << (height - 2) )+ nodeNum(head->left);
            }
    };
  • 相关阅读:
    QAU 18校赛 J题 天平(01背包 判断能否装满)
    滚动数组
    Leapin' Lizards HDU
    Sabotage UVA
    Food HDU
    两个Button 加通一个手势,那么 第一个的就失效了,
    终于把聊天记录保存到数据库当中去了,
    添加好友,
    XEP 0055 (Jabber search) with iphone SDK
    手机ip,
  • 原文地址:https://www.cnblogs.com/diegodu/p/4589836.html
Copyright © 2020-2023  润新知