題目描述: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 };