【LeetCode-樹】完全二叉樹的節點個數
阿新 • • 發佈:2020-07-13
題目描述
給出一個完全二叉樹,求出該樹的節點個數。
說明:
完全二叉樹的定義如下:在完全二叉樹中,除了最底層節點可能沒填滿外,其餘每層節點數都達到最大值,並且最下面一層的節點都集中在該層最左邊的若干位置。若最底層為第 h 層,則該層包含 1 ~ 2^h 個節點。
示例:
輸入:
1
/ \
2 3
/ \ /
4 5 6
輸出: 6
題目連結: https://leetcode-cn.com/problems/count-complete-tree-nodes/
思路1
使用 dfs。程式碼如下:
/** * 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; return countNodes(root->left)+countNodes(root->right)+1; } };
思路2
使用bfs。程式碼如下:
/** * 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; queue<TreeNode*> q; q.push(root); int cnt = 0; while(!q.empty()){ TreeNode* node = q.front(); q.pop(); cnt++; if(node->left!=nullptr) q.push(node->left); if(node->right!=nullptr) q.push(node->right); } return cnt; } };
思路3
上面的兩種方法都是使用遍歷來做,沒有使用到完全二叉樹的性質。
完全二叉樹是一棵空樹或者它的葉子節點只出在最後兩層,若最後一層不滿則葉子節點只在最左側。如果每一層的節點都是滿的,則稱為滿二叉樹。對於一個高度為 d 的滿二叉樹來講,樹中節點的個數為 \(2^d-1\)。
對於完全二叉樹中的一個節點:
- 如果該節點左子樹的高度等於該節點右子樹的高度,都是 h,則說明該節點的左子樹是滿的,通過公式 \(2^h-1\) 計算左子樹的節點個數,再加上根節點共 \(2^h\) 個節點,然後遞迴計算右子樹的節點個數;
- 如果左子樹的高度不等於右子樹的高度,則說明最後一層不滿,但倒數第 2 層滿了,可以通過公式計算右子樹的節點個數並遞迴計算左子樹的節點個數。
程式碼如下:
/**
* 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 left = getHeight(root->left);
int right = getHeight(root->right);
if(left==right){
return pow(2, left) + countNodes(root->right);
}else{
return pow(2, right) + countNodes(root->left);
}
}
int getHeight(TreeNode* root){
if(root==nullptr) return 0;
return max(getHeight(root->left)+1, getHeight(root->right)+1);
}
};