3-3-徹底二叉樹結點數

題目描述: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 }
相關文章
相關標籤/搜索