222. Count Complete Tree Nodes

来源:互联网 发布:知柏地黄丸成分 编辑:程序博客网 时间:2024/05/01 22:33
//超时class Solution {public:    int countNodes(TreeNode* root) {        if(!root) return 0;        return 1+countNodes(root->left)+countNodes(root->right);    }};
//超时class Solution {public:    int countNodes(TreeNode* root) {        if(!root) return 0;        stack<TreeNode*> s;        s.push(root);        int i=0;        while(!s.empty())        {            TreeNode* temp=s.top();            s.pop();            if(temp->left) s.push(temp->left);            if(temp->right) s.push(temp->right);            i++;        }        return i;    }};
//320msclass Solution {public:    int countNodes(TreeNode* root) {        if(!root) return 0;        TreeNode* l=root,*r=root;        int l_level=0,r_level=0;        while(l) {l_level++;l=l->left;}        while(r) {r_level++;r=r->right;}        if(l_level==r_level) return pow(2,l_level)-1;        return 1+countNodes(root->left)+countNodes(root->right);    }};
//296msclass Solution {public:    int countNodes(TreeNode* root) {        if(!root) return 0;        TreeNode* l=root,*r=root;        int l_level=0,r_level=0,temp_level=1;        while(l) {l_level++;l=l->left;}        while(r) {r_level++;r=r->right;}        if(l_level==r_level) return pow(2,l_level)-1;        TreeNode* temp=root->left;        while(temp) {temp_level++;temp=temp->right;}        if(l_level==temp_level) return countNodes(root->right)+pow(2,temp_level-1);         return countNodes(root->left)+pow(2,r_level-1);    }};
//140msclass Solution {public:    int countNodes(TreeNode* root) {        if(!root) return 0;        TreeNode* l=root,*r=root;        int l_level=0,r_level=0,temp_level=1;        while(l) {l_level++;l=l->left;}        while(r) {r_level++;r=r->right;}        if(l_level==r_level) return (1<<(l_level))-1;        TreeNode* temp=root->left;        while(temp) {temp_level++;temp=temp->right;}        if(l_level==temp_level) return countNodes(root->right)+(1<<(temp_level-1));         return countNodes(root->left)+(1<<(r_level-1));    }};
//280msclass Solution {public:    int countNodes(TreeNode* root) {        if(!root) return 0;        TreeNode* l=root->left,*r=root->right;        int l_level=1,r_level=1;        while(l) {l_level++;l=l->left;}        while(r) {r_level++;r=r->left;}        if(l_level==r_level) return pow(2,l_level-1)+countNodes(root->right);        return countNodes(root->left)+pow(2,r_level-1);    }};
//108ms 使用(1<<r_level)代替powclass Solution {public:    int countNodes(TreeNode* root) {        if(!root) return 0;        TreeNode* l=root->left,*r=root->right;        int l_level=0,r_level=0;        while(l) {l_level++;l=l->left;}        while(r) {r_level++;r=r->left;}        if(l_level==r_level) return (1<<l_level)+countNodes(root->right);        return countNodes(root->left)+(1<<r_level);    }};
//80ms 为什么比递归快,是因为每次递归都需要重新计算左右两个方向的告诉,实际上不需要class Solution {public:    int countNodes(TreeNode* root) {        if(!root) return 0;        int sum=0;        TreeNode* l=root->left,*r=root->right;        int l_level=0,r_level=0;        while(l) {l_level++;l=l->left;}        while(r) {r_level++;r=r->left;}        while(root)        {            if(l_level==r_level)             {                sum+=(1<<l_level);                root=root->right;            }            else            {                sum+=(1<<r_level);                root=root->left;            }            if(root)            {                l_level--;                r=root->right;                    r_level=0;                while(r) {r_level++;r=r->left;}                     }        }        return sum;    }};
//80ms 递归,思路同上class Solution {public:    int countNodes(int l_level,TreeNode* root)    {        if(!root) return 0;        TreeNode* r=root->right;        int r_level=0;        while(r) {r_level++;r=r->left;}        if(l_level==r_level) return (1<<l_level)+countNodes(l_level-1,root->right);        return countNodes(l_level-1,root->left)+(1<<r_level);    }    int countNodes(TreeNode* root) {        if(!root) return 0;        TreeNode* l=root->left,*r=root->right;        int l_level=0,r_level=0;        while(l) {l_level++;l=l->left;}        while(r) {r_level++;r=r->left;}        if(l_level==r_level) return (1<<l_level)+countNodes(l_level-1,root->right);        return (1<<r_level)+countNodes(l_level-1,root->left);    }};
0 0
原创粉丝点击