給出一個完全二叉樹,求出該樹的節點個數
解題思路
最直觀的一種解法:遍歷整顆完全二叉樹,記錄每一個節點
class Solution {
public int countNodes(TreeNode root) {
if (root == null){
return 0;
}
return countNodes(root.left) + countNodes(root.right) + 1;
}
}
但這樣的話,對于本題給出的完全二叉樹性質完全沒有利用起來,首先明確完全二叉樹的定義:它是一棵空樹,或者它的葉子節點只出現最后兩層,若最后一層不滿則葉子節點只在最左側
回顧一下滿二叉樹的節點個數,如果滿二叉樹的層數為 h,則總節點數為 2h - 1,我們對 root 節點的左右子樹進行高度統計,分別記為 left 和 right,有以下兩種結果:
- left == right
這說明左子樹一定是完全二叉樹,因為最后一層的節點已經填充到右子樹了,所以左子樹的節點個數就是 2left - 1,再加上當前的 root 節點,則是 2left 個節點,再對右子樹遞回統計 - left != right
說明此時倒數第二層滿了,但最后一層不滿,而且左子樹沒有完全填充,右子樹是一顆滿二叉樹,因此同上,右子樹的節點個數為 2right,再對左子樹進行遞回統計
class Solution {
public int countNodes(TreeNode root) {
if(root == null){
return 0;
}
int left = countLevel(root.left);
int right = countLevel(root.right);
if(left == right){
return countNodes(root.right) + (1<<left);
}else{
return countNodes(root.left) + (1<<right);
}
}
private int countLevel(TreeNode root){
int level = 0;
while(root != null){
level++;
root = root.left;
}
return level;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/227305.html
標籤:其他
