1. 程式人生 > 實用技巧 >20.11.24 leetcode222

20.11.24 leetcode222

題目連結: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; } };