給出一個徹底二叉樹,求出該樹的節點個數java
最直觀的一種解法:遍歷整顆徹底二叉樹,記錄每個節點code
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,有如下兩種結果:io
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; } }