Leetcode 222:徹底二叉樹的節點個數

題目

給出一個徹底二叉樹,求出該樹的節點個數。

說明: 
徹底二叉樹的定義以下:在徹底二叉樹中,除了最底層節點可能沒填滿外,其他每層節點數都達到最大值,而且最下面一層的節點都集中在該層最左邊的若干位置。若最底層爲第 h 層,則該層包含 1~ 2^h 個節點。

思路

1.若是一棵二叉樹是徹底二叉樹,那麼二叉樹最大深度和右子樹的最大深度是相同的話,那麼根節點的左子樹必定是一棵滿二叉樹,利用公式便可求出根節點的左子樹的節點加上根節點的節點數量。
2.若是一棵二叉樹是徹底二叉樹,那麼二叉樹最大深度和右子樹的最大深度是不一樣的話(實際狀況就是二叉樹的最大深度比其右子樹的最大深度大1),那麼右子樹必定是深度 爲二叉樹深度減2的滿二叉樹。
由上述內容可知,一棵徹底二叉樹左右子樹中至少一個是滿二叉樹。

題解

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
//https://www.jianshu.com/p/62db7c855e44
class Solution {
private:
    int height(TreeNode* root){
        if(root == NULL)
            return -1;
        while(root != NULL)
            return height(root->left) + 1;
    }
public:
    int countNodes(TreeNode* root) {
        int h=height(root);
        int nums=0;
        while(root!=NULL){
            if(h-1==height(root->right)){
                nums+=1<<h; //至關於pow(2,h - 1)
                root=root->right;
            }
            else{
                nums+=1<<h-1;
                root=root->left;
            }
            h--;
        }
        return nums;
    }
};

reference

相關文章
相關標籤/搜索