zoukankan      html  css  js  c++  java
  • LeetCode 222. Count Complete Tree Nodes(二分+位运算)

    题目

    题意:计算一个完全二叉树的节点个数

    题解:DFS 或者BFS都太low,我们可以用O(log(n)^2)的效率解决,n为节点个数,log(n)就是树的高度。

    我们首先获得数的高度,然后,二分去寻找,最后一层的最右边的一个节点,就能计算树的节点个数了。

    二分是Log(n),DFS也是Log(n),在DFS的时候我们用位运算来决定向左还是向右。因为二叉树的叶子可以看做二进制数,从根节点开始,向左是0,向右是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 countNodes(TreeNode* root) {
            
            if(root==NULL)
                return 0;
            
            int h=0;
            GetHeight(root,h);
            if(h==0)
                return 1;
            
            int l =0;
            int r = (1<<h)-1;
            
            while(l<=r)
            {
                int mid = (l+r)/2;
                if(DFS(root,mid,1<<(h-1)))
                {
                    l = mid+1;
                }
                else
                {
                    r = mid-1;
                }   
            }
            
            return (1<<h)+r;
     
        }
        
        void GetHeight(TreeNode* root,int& h)
        {
            if(root->left!=NULL)
            {
                GetHeight(root->left,++h);
            }
        }
        
        int DFS(TreeNode* root,int x,int y)
        {
            if(y==0)
                return 1;
            if(x&y)
            {
                if(root->right==NULL)
                    return 0;
                else
                    return DFS(root->right,x,y>>1);
            }
            else
            {
                if(root->left==NULL)
                    return 0;
                else
                    return DFS(root->left,x,y>>1);
            }
        }
    };
    
  • 相关阅读:
    iOS-UIScrollView的使用
    iOS-UILabel的使用
    iOS-UITextField的使用
    iOS-UIScreen,UIFont,UIColor,UIView,UIButton
    jQuery和ajax【“Asynchronous Javascript And XML】
    iOS-NSBundle、NSArray、NSDictionay
    iOS-UINavigationController多控制器管理
    iOS-NSNotification本地推送、远程推送
    iOS-MJRefresh框架
    苹果电脑:快捷键使用
  • 原文地址:https://www.cnblogs.com/dacc123/p/12350348.html
Copyright © 2011-2022 走看看