題目描述:node
給定一棵徹底二叉樹的頭節點head,返回這棵樹的節點個數。
若是徹底二叉樹的節點數爲N,請實現時間複雜度低於O(N)的解法。ios
1 /* 2 思路: 其實也是一種二分的思路。 3 由於是徹底二叉樹,因此能夠分爲根結點的左右子樹計算節點個數。 4 首先求得該徹底二叉樹的深度h。 5 而後判斷根結點的右子樹的最左節點是否在深度h上, 6 若是在,則說明該徹底二叉樹的左子樹爲一個深度爲h-1的滿二叉樹, 7 其結點個數有:2^(h-1)-1個,加上根結點,結點總個數爲2^(h-1)。 8 最後在對右子樹進行遞歸求解其節點個數。 9 若是右子樹的最左結點再也不深度h上,則說明其右子樹爲一個深度爲h-2的滿二叉樹, 10 其結點個數有:2^(h-2)-1個,加上根結點,結點總個數爲2^(h-2)。 11 最後再對左子樹進行遞歸求解結點個數。 12 13 轉換爲通常狀況:若此時根結點處於 14 */ 15 #include <iostream> 16 using namespace std; 17 18 struct TreeNode { 19 int val; 20 struct TreeNode *left; 21 struct TreeNode *right; 22 TreeNode(int x) : 23 val(x), left(NULL), right(NULL) { 24 } 25 }; 26 27 int mostLeftDepth(struct TreeNode* head, int level){ // 求head的最左節點所處的深度 28 while (head != NULL){ 29 level++; 30 head = head->left; 31 } 32 return level-1; 33 } 34 int bs(struct TreeNode* head, int l, int h){ 35 if (l == h) 36 return 1; 37 if (mostLeftDepth(head->right,l+1) == h) 38 return (1 << (h-l)) + bs(head->right, l+1, h); 39 else 40 return (1 << (h-l-1)) + bs(head->left, l+1, h); 41 } 42 43 int nodeNum(struct TreeNode* head) { 44 if (head == NULL) 45 return 0; 46 return bs(head, 1, mostLeftDepth(head,1)); 47 } 48 49 int main(){ 50 TreeNode* head = new TreeNode(1); 51 TreeNode* a = new TreeNode(2); 52 head->left = a; 53 TreeNode* b = new TreeNode(3); 54 head->right = b; 55 cout << nodeNum(head) << endl; 56 return 0; 57 }