题意:计算一个完全二叉树的节点个数
题解: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); } } };
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
我来说两句