完全二叉樹的節點個數
阿新 • • 發佈:2020-11-24
給出一個完全二叉樹,求出該樹的節點個數
解題思路
最直觀的一種解法:遍歷整顆完全二叉樹,記錄每一個節點
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; } }