leetcode 222. 徹底二叉樹的節點個數

題目描述:node

給出一個徹底二叉樹,求出該樹的節點個數。spa

說明:code

徹底二叉樹的定義以下:在徹底二叉樹中,除了最底層節點可能沒填滿外,其他每層節點數都達到最大值,而且最下面一層的節點都集中在該層最左邊的若干位置。若最底層爲第 h 層,則該層包含 1~ 2h 個節點。blog

示例:get

輸入:
1
/ \
2 3
/ \ /
4 5 6it

輸出: 6io

 

思路分析:class

思路一:利用層次遍歷的方式,統計節點總數。二叉樹

思路二:利用樹的高度來求解。遍歷

徹底二叉樹的高度能夠直接經過不斷地訪問左子樹就能夠獲取 判斷左右子樹的高度: 若是相等說明左子樹是滿二叉樹, 而後進一步判斷右子樹的節點數(最後一層最後出現的節點必然在右子樹中) 若是不等說明右子樹是深度小於左子樹的滿二叉樹, 而後進一步判斷左子樹的節點數(最後一層最後出現的節點必然在左子樹中)

代碼:

思路一:

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     void level_order(TreeNode*root, vector<vector<int>>& tmp, int level)
13     {
14         if(root == nullptr)
15             return;
16         if(tmp.size()<=level)
17         {
18             tmp.push_back(vector<int>{});
19         }
20         tmp[level].push_back(root->val);
21         level_order(root->left, tmp, level+1);
22         level_order(root->right, tmp, level+1);
23     }
24     int countNodes(TreeNode* root) {
25         if(root == nullptr)
26             return 0;
27         vector<vector<int>> tmp;
28         level_order(root, tmp, 0);
29         int res=0;
30         for(int i=0; i<tmp.size(); i++)
31         {
32             res += tmp[i].size();
33         }
34         return res;
35     }
36 };

 

思路二:

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     int get_height(TreeNode* root)
13     {
14         if(root == nullptr)
15             return 0;
16         int depth=0;
17         while(root)
18         {
19             depth++;
20             root=root->left;
21         }
22         return depth;
23     }
24     int countNodes(TreeNode* root) {
25         if(root == nullptr)
26             return 0;
27         int l = get_height(root->left);
28         int r = get_height(root->right);
29         if(l==r)
30             return (1<<l)+countNodes(root->right);// 1(根節點) + (1 << ld)-1(左徹底左子樹節點數) + 右子樹節點數量
31         else
32             return (1<<r)+countNodes(root->left);// 1(根節點) + (1 << rd)-1(右徹底右子樹節點數) + 左子樹節點數量
33         
34     }
35 };
相關文章
相關標籤/搜索