20.11.24 leetcode222
阿新 • • 發佈:2020-11-24
題目連結:https://leetcode-cn.com/problems/count-complete-tree-nodes/
題意:利用完全二叉樹的性質,求完全二叉樹的結點數。
分析:如果是單純的二叉樹,直接用dfs或者bfs。針對本題,首先我們得知道完全二叉樹的性質是:除了最下面一層,中間每層結點數是滿的,且最下面一層的結點都位於最左邊。在求得層數後,除了最下面一層的所有層的結點數可以很輕鬆的求到,我們的任務主要是求最下面一層有多少結點。這裡可以採用二分法來快速求得最下面一層,而在判斷某個結點是否存在的時候,可以利用位運算,具體來說,對於某個結點,我們用二進位制來表示的話,從根結點1開始,從根節點往左,就是添0,往右就是添1,以5為例,其二進位制是101,而它就是從根節點左結點的右結點,所有可以利用二進位制來快速的判斷是否存在某個結點。
/** * 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==nullptr)return 0;int level=0; TreeNode* node=root; while(node->left!=nullptr){ level++; node=node->left; } if(level==0)return 1; int ans=1; int low=1<<level,high=(1<<(level+1))-1; while(low<=high){ int mid=(high+low)/2; if(exist(mid,level,root)){ ans=mid; low=mid+1; } else{ high=mid-1; } } return ans; } bool exist(int k,int level,TreeNode* root){ int bit=1<<(level-1); TreeNode* node=root; while(node!=nullptr&&bit>0){ if(!(bit&k)){ node=node->left; } else node=node->right; bit>>=1; } return node!=nullptr; } };