1. 程式人生 > >Leetcode 222:完全二叉樹的節點個數

Leetcode 222:完全二叉樹的節點個數

根節點 定義 如果 turn pri def class lee ^h

題目

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

說明: 
完全二叉樹的定義如下:在完全二叉樹中,除了最底層節點可能沒填滿外,其余每層節點數都達到最大值,並且最下面一層的節點都集中在該層最左邊的若幹位置。若最底層為第 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

  • 0222-Count Complete Tree Nodes

Leetcode 222:完全二叉樹的節點個數