1. 程式人生 > 實用技巧 >完全二叉樹的節點個數

完全二叉樹的節點個數


給出一個完全二叉樹,求出該樹的節點個數


解題思路

最直觀的一種解法:遍歷整顆完全二叉樹,記錄每一個節點

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,有以下兩種結果:

  1. left == right
    這說明左子樹一定是完全二叉樹,因為最後一層的節點已經填充到右子樹了,所以左子樹的節點個數就是 2left - 1,再加上當前的 root 節點,則是 2left 個節點,再對右子樹遞迴統計
  2. 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;
    }
}