徹底二叉樹的節點個數


給出一個徹底二叉樹,求出該樹的節點個數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

  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;
    }
}
相關文章
相關標籤/搜索